1. 程式人生 > >java 多線程 1 : 基礎

java 多線程 1 : 基礎

適合 ide spa 執行 使用 基礎 至少 註意 over

進程和線程:  一個程序運行後至少有一個進程,一個進程裏面可以包含多個線程,但是至少要包含一個線程。

線程的創建和啟動:

方式1:繼承Thread類創建線程類,步驟
     1.定義Thread類的子類,重寫該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務,因此run()方法也被稱為線程執行體
     2.創建Thread子類的實例,即創建了線程對象
     3.調用線程對象的start()方法來啟動該線程

public class Thread1 extends Thread{
private int i;
@Override
public void run() {
for( ; i < 100 ; i++) {
System.out.println(getName() + "-----" + i);
}
}

public static void main(String[] args) {
for(int i = 0; i<100; i++) {
System.out.println(Thread.currentThread().getName() + " -- " + i);
if(i == 20) {
new Thread1().start();
new Thread1().start();
}
}
}
}

技術分享圖片技術分享圖片

註意:main()方法的方法體就是主線程的線程體
   Demo中i為Thread1的實例變量,但因為程序每次創建線程對象都需要創建一個Thread1對象,兩個線程是不會共享該實例變量的 , 強調這一點,是想和方式2做比較,加深理解。

方式2:實現Runnable接口創建線程類,步驟
     1.定義Runnable接口的實現類,重寫該類的run()方法,run()方法為該線程的線程執行體
     2.創建Runnable實現類的實例,並以此實例作為Thread的Target來創建Thread對象,該Thread對象才是真正的線程對象
     3.調用線程對象的start()方法來啟動該線程

public class Thread2 implements Runnable{
    private int i;
    @Override
    public void run() {
        for( ; i < 100; i ++) {
            //
            System.out.println(Thread.currentThread().getName() + " -- " + i);
        }
    }
    
    public static void main(String[] args) {
        
for(int i = 0 ; i < 100 ; i++) { System.out.println(Thread.currentThread().getName() + " -- " + i); if(i == 20) { Thread2 th = new Thread2(); new Thread(th , "線程1").start(); new Thread(th , "線程2").start(); } } } }

技術分享圖片

註意:調用getName的方式必須是通過Thread.currentThread.getName(),因為Runnable對象只能作為線程對象的target
   運行demo可以看到,兩個子線程的i變量是連續的,也就是采用runnale接口方式創建的多個線程可以共享線程類的實例變量,程序創建的Runnable對象只是線程的target,而多個線程,可以共享一個target,所以,多個線程可以共享一個線程類(實際上應該是線程的target類)的實例變量。

     

方式3:使用Callable 和 Future 創建線程:

實際運用過程中使用方式2和方式3比較多 , 1. 單繼承,多實現 , 2. 多個線程可以共享一個target對象,所以非常適合多個線程來出來同一份資源得情況   

java 多線程 1 : 基礎