執行緒的阻塞 通過外部干涉終止乙個執行緒

2021-07-12 03:48:53 字數 1735 閱讀 3030

執行緒的生命週期

執行緒的阻塞

thread類中提供了join方法用來合併執行緒,原本有兩個執行緒兩條通道,使用了join方法以後就只剩一條通道,那麼此時兩個執行緒不再併發執行,而是順序執行,那麼如何確定這兩個執行緒誰先執行呢?

假設,我在main方法中有執行緒t1,那麼此時就是main,和t1兩個執行緒

然後呼叫t1.join(),main執行緒就被阻塞,等到t1執行緒終止以後,mian執行緒才開始繼續執行

也就是,哪個執行緒呼叫了join方法,哪個執行緒就先執行

thread類提供了乙個靜態方法yield,不同於join,yield方法是暫停當前正在執行的執行緒物件,

也就是暫停自己執行其他的執行緒,由於yield是個靜態方法,所以寫在哪乙個執行緒體裡面,就暫停哪個執行緒

放在上面的例子上,在main方法中呼叫yield方法,就是暫停main執行緒,使t1執行緒先執行

sleep方法經常用於兩種形式:

1.與時間相關,倒計時

public class sleepdemo 

} /**

* 倒數5個數

*/int num=10;

while(true)

} }}

2.模擬網路延時

public class sleepdemo02 

}class web implements runnable

try catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"搶到了 "+num--);

} }}

加入執行緒休眠以後,這裡輸出就出現了問題,假設最後僅剩1張票,此時t1通過if語句,進入休眠,這裡的num值依然為1,所以當t2執行緒進行if語句判斷時也可以通過,沒有跳出迴圈,那麼t1醒來時拿走了最後一張票1,t2醒來從程式語言來說,拿走了票0.但是實際上並沒有這張票,就出現了資源衝突問題

這是在多執行緒中需要解決的併發問題(待續,詳請見新博文)

如何停止乙個執行緒,有兩種方式

1.自然的終止,執行緒體正常執行完畢,這個執行緒就會終止

2.外部干涉:

3)提供對外方法改變該標識

4)外部根據條件呼叫這個方法

見**示例:

public class closethread 

system.out.println("thread.."+i);

} }}class study implements runnable

@override

public void run()

}}

輸出的部分結果為

可見,當i=50時,stop方法並不是立刻被執行的,這與處理機的排程有關

但還是可以看出通過外部干涉的方法使執行緒終止

thread類也提供了stop方法,但是不建議使用,api中也明確提出該方法不安全 

終止乙個執行緒

可以讓執行緒呼叫exitthread函式,以便強制執行緒終止執行 函式原型 void exitthread dword dwexitcode 該函式將終止執行緒的執行,並導致作業系統清除該執行緒使用的所有作業系統資源。但是,c 資源 如c 類物件 將不被撤消。由於這個原因,最好從執行緒函式返回,而不...

那麼要怎麼終止乙個執行緒呢?

雖然thread.stop 方法可以結束乙個執行緒,但是eclipse已經將這個方法標註成乙個 廢棄 的方法,也就是不推薦使用,原因大家都知道,就是stop 方法直接終止執行緒並釋放掉鎖,容易造成一些對資料進行修改的執行緒出問題,例如導致多個執行緒讀到不一致的資料的情況。看看下面這個例子 要做的事情...

執行緒睡眠,掛起,阻塞的乙個形象比喻

作業系統中睡眠 阻塞 掛起的區別形象解釋 首先這些術語都是對於執行緒來說的。對執行緒的控制就好比你控制了乙個雇工為你幹活。你對雇工的控制是通過程式設計來實現的。掛起執行緒的意思就是你對主動對雇工說 你睡覺去吧,用著你的時候我主動去叫你,然後接著幹活 使執行緒睡眠的意思就是你主動對雇工說 你睡覺去吧,...