建立執行緒的方式 執行緒建立到底有幾種方式?

2021-10-12 07:43:54 字數 3400 閱讀 9056

在網上搜尋執行緒建立的集中方式,大約都是多的三種或者四種,我們看下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介面的方...