(1).首先,定義壹個類來繼承Thread父類,並在父類中重寫run()方法。向run()方法添加特定的任務代碼或處理邏輯。
(2)直接創建壹個ThreadTest類的對象,或者使用多態性將變量聲明為父類的類型。
(3)調用start方法,線程啟動,隱式調用run()方法。
【java】?觀平原?復制
公共?班級?ThreadTest?延伸?線程{
公共?作廢?run(){
for(int?I = 0;我& lt=10;i++){
system . out . println(I);
}?
}
公共?靜電?作廢?main(String[]?args)?{
ThreadTest?thread1=new?ThreadTest();
ThreadTest?thread2=new?ThreadTest();
thread 1 . start();
thread 2 . start();
}
}
2.通過實現Runnable接口創建壹個線程。
(1).定義壹個類來實現Runnable接口,並在接口中重寫run()方法。向run()方法添加特定的任務代碼或處理邏輯。
(2)創建Runnable接口實現類的對象。
(3)創建ThreadTest類的對象,需要封裝Runnable接口實現的類的對象。(接口可以實現多重繼承)
(4)調用Thread對象的start()方法啟動線程。
【java】?觀平原?復制
公共?班級?ThreadTest?器物?可運行{
@覆蓋
公共?作廢?run()?{
for(int?I = 0;我& lt=10;i++){
system . out . println(I);
}?
}
公共?靜電?作廢?main(String[]?args)?{
ThreadTest?threadTest=new?ThreadTest();
線程?theard=new?thread(threadTest);
theard . start();
}
}
3.通過Callable和Future創建線程
(1)創建Callable接口的實現類,實現call()方法,該方法將作為線程執行器,有返回值。
(2)創建Callable實現類的實例,使用FutureTask類封裝Callable對象,封裝Callable對象的call()方法的返回值。
(3)使用FutureTask對象作為Thread對象的目標,創建並啟動壹個新線程。
(4)調用FutureTask對象的get()方法,獲取子線程執行後的返回值。
【java】?觀平原?復制
公共?班級?ThreadTest?器物?可調用& lt整數& gt{
@覆蓋
公共?整數?call()?摔投?例外?{
int?數數?=0;
for(int?I = 0;我& lt=10;i++){
count = count+I;
}
回歸?數數;?
}
公共?靜電?作廢?main(String[]?args)?摔投?中斷異常,?執行異常?{
ThreadTest?測試=新?ThreadTest();
FutureTask & lt整數& gt?線程?=?新的?FutureTask & lt& gt(測試);
新的?線程(Thread,“有返回值的線程”)。start();
system . out . println(thread . get());
}
}
通過實現Runnable接口創建的線程可以* *共享同壹個目標對象(tread demo 1tt = newtread demo 1());),以便多個相同的線程可以處理相同的資源。
再看JDK的壹個解釋:
那個?可運行?接口應該由任何其實例將由線程執行的類來實現。該類必須定義壹個名為drun的無參數方法。
該接口旨在為希望在活動時執行代碼的對象提供壹個通用協議。比如Runnable?是由classThread實現的。活躍僅僅意味著壹個線程已經被啟動,還沒有被停止。
另外,?可運行?提供了在不子類化Thread的情況下使類處於活動狀態的方法。實現Runnable的類。可以不用子類化Thread運行?通過實例化壹個線程?實例並將其自身作為目標傳入。在大多數情況下,這是不可行的?如果您只打算重寫therun(),則應該使用。方法而沒有其他線程?方法。這很重要,因為除非程序員打算修改或增強類的基本行為,否則類不應該被子類化。
當通過實現Runnable和Callable接口創建多線程時,優勢如下:
線程類只實現Runnable接口或Callable接口,可以繼承其他類。
這樣多線程可以共享同壹個目標對象,非常適合多線程處理同壹個資源,使CPU、代碼、數據分離,形成清晰的模型,更好的體現了面向對象的思想。
缺點是:
編程有點復雜。如果要訪問當前線程,必須使用Thread.currentThread()方法。
采用繼承線程類的方式:
(1)的優點:寫起來簡單。如果需要訪問當前線程,可以不使用Thread.currentThread()方法獲取當前線程。
(2)缺點:因為thread類繼承了Thread類,所以不能繼承其他父類。
采用實現可運行接口方式:
(1)優點:thread類只實現Runable接口,還可以繼承其他類。這樣多線程可以共享同壹個目標對象,非常適合多線程處理同壹個資源,使CPU代碼和數據分離,形成清晰的模型,更好的體現了面向對象的思想。
(2)缺點:編程有點復雜。如果需要訪問當前線程,必須使用Thread.currentThread()方法。