線程的創(chuàng)建和啟動方式
??Java使用Thread代表線程,所有的線程對象都必須是Thread類或其子類的實例。每條線程的作用是完成一條、定的任務(wù)锨能,實際上就是執(zhí)行一段程序流(一段順
序執(zhí)行的代碼)。Java使用run方法來封裝這樣一段程序流。
1. Thread類創(chuàng)建線程類
通過繼承Thread類來創(chuàng)建并啟動多線程的步驟如下:
定義Thread類的子類址遇,并重寫該類的run方法熄阻,該run方法的方法體就是代表了線程需要完成的任務(wù)。因此倔约,我們經(jīng)常把run方法稱為線程執(zhí)行體秃殉。
創(chuàng)建Thread子類的實例,即創(chuàng)建了線程對象跺株。
用線程對象的start方法來啟動該線程复濒。
下面程序示范了通過繼承Thread類來創(chuàng)建、并啟動多線程的程序乒省。
public class FirstThread extends Thread {
private int i;
//重寫run方法,run方法體就是線程執(zhí)行體
@Override
public void run() {
for (; i < 100; i++) {
//當線程類繼承Thread類時畦木,可以直接調(diào)用getName()方法來返回當前線程的名袖扛。
//如果想獲取當前線程,直接使用this即可
//Thread對象的getName()返回當前該線程的名字
System.out.println(getName() + " " + i+i);
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
//調(diào)用Thread的currentThread方法獲取當前線程
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 20) {
//創(chuàng)建十籍、并啟動第一條線程
new FirstThread().start();
//創(chuàng)建蛆封、并啟動第二條線程
new FirstThread().start();
}
}
}
}
注意:使用繼承Thread類的方法來創(chuàng)建線程類,多條線程之間無法共享線程類的實例變量勾栗。
2. 實現(xiàn)Runnable接口創(chuàng)建線程類
實現(xiàn)Runnable接口來創(chuàng)建并啟動多條線程的步驟如下:
定義Runnable接口的實現(xiàn)類惨篱,并重寫該接口的run方法,該run方法的方法體同樣是該線程的線程執(zhí)行體围俘。
創(chuàng)建Runnable實現(xiàn)類的實例砸讳,并以此實例作為Thread的target來創(chuàng)建Thread對象,該Thread對象才是真正的線程對象界牡。代碼如下所示:
//創(chuàng)建Runnable實現(xiàn)類的對象
SecondThread st = new SecondThread();
//以Runnable實現(xiàn)類的對象作為Thread的target來創(chuàng)建Thread對象簿寂,即線程對象
new Thread(st);
//也可以在創(chuàng)建Thread對象時為該對象指定一個名字
//創(chuàng)建Thread對象時指定target和新線程的名字
new Thread(st,"新線程1");
下面程序示范了通過實現(xiàn)Runnable接口來創(chuàng)建并啟動多線程的程序:
public class SecondThread implements Runnable {
private int i;
//run方法同樣是線程執(zhí)行體
@Override
public void run() {
for (; i < 100; i++) {
//當線程類實現(xiàn)Runnable接口時,
//如果想獲取當前線程宿亡,只能用Thread.currentThread()方法
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){
SecondThread st = new SecondThread();
//通過new Thread(target,name)方法創(chuàng)建新線程
new Thread(st,"新線程1").start();
new Thread(st,"新線程2").start();
}
}
}
}
3. 兩種方式所創(chuàng)建線程的對比
通過繼承Thread或?qū)崿F(xiàn)Runnable接口都可以實現(xiàn)多線程常遂,但兩種方式存在一定的差別,相比之下兩種方式的主要差別如下:
采用實現(xiàn)Runnable接口方式的多線程:
線程類只是實現(xiàn)了Runnable接口挽荠,還可以繼承其他類克胳。
在這種方式下,可以多個線程共享同一個target對象圈匆,所以非常適合多個相同線程來處理同一份資源的情況漠另,從而可以將CPU、代碼和數(shù)據(jù)分開臭脓,形成清晰的模型酗钞,較好的體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>
劣勢是:編程稍稍復(fù)雜,如果需要訪問當前線程,必須使用Thread.currentThread()方法砚作。
采用繼承Thread類方式的多線程:
劣勢是:因為線程類已經(jīng)繼承了Thread類窘奏,所以不能再繼承其他父類。
劣勢是:編寫簡單葫录,如果需要訪問當前線程着裹,無需使用Thread.currentThread()方法,直接使用this即可獲得當前線程米同。