天天看點

多線程_如何實作多線程及多線程方式1的思路、多線程方式1的代碼實作

package cn.itcast_02;

/*
 * 需求:我們要實作多線程的程式。
 * 如何實作呢?
 *     由于線程是依賴程序而存在的,是以我們應該先建立一個程序出來。
 *     而程序是由系統建立的,是以我們應該去調用系統功能建立一個程序。
 *     Java是不能直接調用系統功能的,是以,我們沒有辦法直接實作多線程程式。
 *     但是呢?Java可以去調用C/C++寫好的程式來實作多線程程式。
 *     由C/C++去調用系統功能建立程序,然後由Java去調用這樣的東西,
 *     然後提供一些類供我們使用。我們就可以實作多線程程式了。
 * 那麼Java提供的類是什麼呢?
 *     Thread
 *     通過檢視API,我們知道了有2種方式實作多線程程式。
 * 
 * 方式1:繼承Thread類。
 *     步驟:
 *       A:自定義類MyThread繼承Thread類。
 *       B:MyThread類裡面寫run()?
 *         為什麼是run()方法呢?
 *       C:建立對象
 *       D:啟動線程
 */
public class MyThreadDemo {
  public static void main(String[] args) {
    // 建立線程對象
    // MyThread my = new MyThread();
    // 啟動線程
    // my.run();
    // my.run();
    // 調用run()方法為什麼是單線程的呢?
    // 因為run()方法直接調用其實就相當于普通的方法調用,是以你看到的是單線程的效果
    // 要想看多線程的效果,就必須說說别一個方法:start()
    // 面試題:run()和start()的差別?
    // run()僅僅是封裝被執行的代碼,直接調用是普通方法。
    // start():首先啟動了線程,然後再由jvm調用該線程的run()方法。
    // MyThread my = new MyThread();
    // my.start();
    // IllegalThreadStateException:非法的線程狀态異常
    // 為什麼呢?因為這個相當于my線程被調用了兩次,而不是兩個線程啟動。
    // my.start();

    // 建立兩個線程對象
    MyThread my1 = new MyThread();
    MyThread my2 = new MyThread();
    my1.start();
    my2.start();
  }
}      
package cn.itcast_02;

/*
 * 該類要重寫run()方法,為什麼呢?
 * 不是類中的所有代碼都需要被線程執行的。
 * 而這個時候,為了區分哪些代碼能夠被線程執行,java提供了Thread類中的run()用來包含那些被線程執行的代碼。
 */
public class MyThread extends Thread {

  @Override
  public void run() {
    // 自已寫代碼
    // System.out.println("天天向上,好好學習");
    // 一般來說,被線程執行的代碼肯定是比較耗時的。是以我們用循環改進
    for (int x = 0; x < 30; x++) {
      System.out.println(x);
    }
  }
}