在網上搜尋執行緒建立的集中方式,大約都是多的三種或者四種,我們看下jdk的原始碼怎麼說的?
原始碼中說的建立執行緒有兩種方式類thread和介面runable;
網上第三種:實現callable介面,結合futuretask建立執行緒,這種方式我們檢視原始碼也可以看出它實際上也屬於實現runable介面方式:
public class futuretaskimplements runnablefuture{};
public inte***ce runnablefutureextends runnable, future{}
還有第四種執行緒池的建立,他們的任務其實都是上面最基本的兩個實現的衍生。
thread與runanble的區別:thread是對執行緒的抽象,runable是對任務的抽象
thread中的方法:
stop():jdk對這些deprecated的方法不建議使用,帶有很高的強制性,終止執行緒很野蠻,直接結束掉,不管當前資源有沒有正常釋放掉。
interrupt():對執行緒發起中斷,並不是正真的終止執行緒,給執行緒乙個中斷標誌位,執行緒不會立即停止,也可以完成不用理會,這說明,在jdk裡面,執行緒是協作式的,而不是搶占式的
//在程式中,如果所有的非守護執行緒都已經執行完畢,那麼守護執行緒將立即被結束,因此守護執行緒的finally子句不一定能夠執行
thread.interrupted():獲取當前執行緒的狀態是否被中斷,如果中斷,會重置中斷狀態。
測試如下:
thread.currentthread().interrupt();
system.out.println("mainthread interrupt:" + thread.currentthread().isinterrupted());
system.out.println("mainthread interrupt:" + thread.interrupted());
system.out.println("mainthread interrupt:" + thread.currentthread().isinterrupted());
// 執行結果如下:
mainthread interrupt:false
mainthread interrupt:false
mainthread interrupt:false
原始碼如下:
public static boolean interrupted()
不建議在類中定義乙個iscannel標誌位來中斷執行緒,如果run方法中有sleep()或者wait()等阻塞方法,在外面設定setcannel(true),根本沒有,而thread中的中斷方法都throw 了乙個interruptedexception,對於外界的中斷會有感知,下面是乙個測試例子:
public class endthread
@override
public void run() catch (interruptedexception e)
system.out.println(threadname + "isruning");
system.out.println(threadname + "inner interrupt flag="+isinterrupted());
}system.out.println(threadname+" 11 interrupt flag = " + isinterrupted());}}
public static void main(string args) throws interruptedexception
}
執行結果如下,外面發生乙個中斷操作,子執行緒中雖然在sleep,但是立馬感知到了中斷,然後進入了catch異常裡面,此時將這個interruptedexception異常又將執行緒的flag改為false,執行緒又繼續再往下執行,這樣做的好處就是給開發人員留有餘地,可以再catch中進行一些資源的釋放等工作,如果這時想中斷執行緒,可以在catch中手動interrupt()中斷執行緒。
join(): 可以實現執行緒的順序執行,當前執行緒需要等待previousthread執行緒終止之後才從thread.join返回。簡單來說,就是執行緒沒有執行完之前,會一直阻塞在join方法處。
join(long millis): 至多等待多少毫秒
public class usejoin
public goddess()
public void run() catch (interruptedexception e)
sleeptools.second(2);//休眠2秒
system.out.println(thread.currentthread().getname() + " goddess打飯完成.");}}
static class goddessboyfriend implements runnable
}public static void main(string args) throws exception
}// 執行結果如下:
connected to the target vm, address: '127.0.0.1:56883', transport: 'socket'
lison開始排隊打飯.....
goddess開始排隊打飯.....
goddessboyfriend開始排隊打飯.....
thread-0 goddessboyfriend打飯完成.
thread-1 goddess打飯完成.
main lison打飯完成.
建立執行緒有幾種方式
程式中,我們經常需要使用到執行緒來幫我們做事情,那麼建立執行緒有哪些方式呢?1.繼承 thread 類,並且重寫 run 方法。2.實現 runnable 介面,並且重寫 run 方法。3.實現 callable 介面,並且重寫 call 方法。4.使用 executors 類建立執行緒池。第一種方...
建立執行緒有幾種方式
thread 類本質上是實現了 runnable 介面的乙個例項,代表乙個執行緒的例項。啟動線 程的唯一方法就是通過 thread 類的 start 例項方法。start 方法是乙個 native 方 法,它將啟動乙個新執行緒,並執行 run 方法。如果自己的類已經 extends 另乙個類,就無法...
執行緒建立方式
使用乙個類繼承thread類,之後通過該類重寫run方法,可以直接通過建立該類物件的start方法建立執行緒。通過實現runnable介面建立執行緒類。建立執行緒時 new thread 實現介面的類例項,建立執行緒的名稱 start 對比兩種方法,其中最大的差別就是通過實現runnable介面的方...