java 多線程 1 : 基礎
進程和線程: 一個程序運行後至少有一個進程,一個進程裏面可以包含多個線程,但是至少要包含一個線程。
線程的創建和啟動:
方式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 : 基礎