多執行緒 執行緒通訊

2021-09-25 09:50:04 字數 4000 閱讀 7267

總結

今天小鹹兒來講解乙個好玩的事,那就是執行緒之間該如何通訊,執行緒通訊之後又會出現什麼問題?

先來一張導圖來看看執行緒通訊的分布?

疑問:如果想要執行緒按照使用者自定義的順序執行的話,那該如何操作呢?

思考:如果能夠讓執行緒等待先執行的執行緒執行完,再執行不就能達到效果了嗎!?

果然出現問題之後,就會有對應的解決之法,接下來先看乙個簡單而且有趣的方法——join

thread 提供了讓乙個執行緒等待另乙個執行緒完成的方法——join()方法。

**展示:

package com.practice.demo.thread;

/** * 執行緒的第三個例項,繼承thread類

* 測試join()方法

* @author phyllis

* @date 2023年7月2日17:26:23

*/public

class

jointhread

extends

thread

/** * 重寫run()方法,定義執行緒執行體

*/@override

public

void

run()}

public

static

void

main

(string[

] args)

throws exception

system.out.

println

(thread.

currentthread()

.getname()

+" "

+i);}}

}

列印結果:

結果:當i=20時,被join的執行緒開始執行,這時,main執行緒一直處於阻塞的狀態,所以一直在等待,等到join的執行緒結束後,則開始執行。

這個方法看到名字就會很清楚是幹什麼用的了,就是表面意思,讓執行緒睡一會。

synchronized

(res)

thread.

sleep

(1000);

}catch

(exception e)

system.out.

println

(res.name +

","+ res.***)

; res.flag =

false

; res.

notify()

;}

如果需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,則可以通過thread類的靜態sleep()方法來實現。

與之類似的方法還有乙個yield()方法

yield()靜態方法和sleep()方法類似,它也可以讓當前正在執行的執行緒暫停,但它不會阻塞該執行緒,它只是將該執行緒轉入就緒狀態。

synchronized

(res)

thread.

yield()

;}catch

(exception e)

system.out.

println

(res.name +

","+ res.***)

; res.flag =

false

; res.

notify()

;}

缺點:yield方法只是讓當前執行緒暫停一下,讓系統的執行緒排程器重新排程一次,完全可能的情況是:當某個執行緒呼叫了yield方法暫停之後,執行緒排程器又再次排程到了該執行緒。

sleep方法和yield方法的區別:

重點來了,等待喚醒機制是什麼,在多執行緒執行過程中,在a執行緒對共享變數,進行操作時,b執行緒要等待。a執行緒結束操作時,則喚醒b執行緒

示例:生產與消費

package com.practice.demo.thread;

/** * 共享物件

* @author phyllis

* @date 2023年7月12日09:15:26

*/class

res/**

* 生產這執行緒

* @author phyllis

* @date 2023年7月12日09:16:55

*/class

inthread

extends

thread

@override

public

void

run(

)catch

(exception e)}if

(count ==0)

else

// 0 1 0 1 0 1 0 1

count =

(count +1)

%2;// 標記當前執行緒為等待

res.flag =

true

;// 喚醒被等待的執行緒

res.

notify()

;}}}

}/**

* 消費這執行緒,讀

* @author phyllis

* @date 2023年7月12日09:16:55

*/class

outthread

extends

thread

@override

public

void

run(

) thread.

sleep

(1000);

}catch

(exception e)

system.out.

println

(res.name +

","+ res.***)

; res.flag =

false

; res.

notify()

;}}}

}/**

* 客戶端

* @author phyllis

* @date 2023年7月12日09:16:55

*/public

class

thirdthread

}

列印結果:

所以使用等待喚醒機制來保證生產乙個,消費乙個。

注意:wait和notify方法,一定要在synchronized中進行,持有同一把鎖。

wait和join的區別:

wait需要被喚醒。

wait和sleep的區別:

sleep不會釋放鎖。

在寶圖中也可以明顯的看出,小鹹兒在通訊那裡打了兩個問號,也就是說通訊有可能會導致執行緒安全的問題,那麼執行緒安全是什麼呢?又該如何解決呢?且聽小鹹兒下次分享。

多執行緒是十分實用並且常用的內容,接下來小鹹兒還會繼續深入學習多執行緒,更多的內容等待更新。

執行緒通訊,多執行緒

多執行緒 thread handler thread處理一些複雜的業務邏輯 耗時的事情 handler在主線程中接收訊息的乙個物件 mhandler.sendmessage msg 傳送乙個訊息物件 mhandler.sendemptymessage what 傳送空訊息,只有what沒有obj m...

多執行緒 執行緒通訊

1.使用wait notify方法實現執行緒之間的通訊 1 有其他執行緒呼叫同乙個物件的notify或者notifyall方法 呼叫notify notifyall方法之前 2 被喚醒之後重新獲得物件的鎖 呼叫notify notifyall方法之後 編寫測試 如下 執行結果 2.管道通訊 管道流主...

多執行緒通訊

from threading import from time import ctime import socket import pickle class data def init self,kind none,to none,from none,message none self.kind k...