线程间通信的几种方法_并发编程中的线程间通信
線程通信的目標(biāo)是使線程間能夠互相發(fā)送信號(hào)。另一方面,線程通信使線程能夠等待其他線程的信號(hào)。
線程通信常用的方式有:
- wait/notify 等待
- Volatile 內(nèi)存共享
- CountDownLatch 并發(fā)工具
- 使用 ReentrantLock 結(jié)合 Condition
- 基本LockSupport實(shí)現(xiàn)線程間的阻塞和喚醒
方式一:使用 volatile 關(guān)鍵字
基于 volatile 關(guān)鍵字來(lái)實(shí)現(xiàn)線程間相互通信是使用共享內(nèi)存的思想,大致意思就是多個(gè)線程同時(shí)監(jiān)聽一個(gè)變量,當(dāng)這個(gè)變量發(fā)生變化的時(shí)候 ,線程能夠感知并執(zhí)行相應(yīng)的業(yè)務(wù)。這也是最簡(jiǎn)單的一種實(shí)現(xiàn)方式
運(yùn)行結(jié)果為:
方式二:使用Object類的wait() 和 notify() 方法
眾所周知,Object類提供了線程間通信的方法:wait()、notify()、notifyaAl(),它們是多線程通信的基礎(chǔ),而這種實(shí)現(xiàn)方式的思想自然是線程間通信。
注意: wait和 notify必須配合synchronized使用,wait方法釋放鎖,notify方法不釋放鎖
運(yùn)行結(jié)果為
由打印結(jié)果截圖可知,在線程A發(fā)出notify()喚醒通知之后,依然是走完了自己線程的業(yè)務(wù)之后,線程B才開始執(zhí)行,這也正好說(shuō)明了,notify()方法不釋放鎖,而wait()方法釋放鎖。
方式三:使用JUC工具類 CountDownLatch
jdk1.5之后在java.util.concurrent包下提供了很多并發(fā)編程相關(guān)的工具類,簡(jiǎn)化了我們的并發(fā)編程代碼的書寫,***CountDownLatch***基于AQS框架,相當(dāng)于也是維護(hù)了一個(gè)線程間共享變量state
運(yùn)行結(jié)果為:
方式四:使用 ReentrantLock 結(jié)合 Condition
運(yùn)行結(jié)果為:
顯然這種方式使用起來(lái)并不是很好,代碼編寫復(fù)雜,而且線程B在被A喚醒之后由于沒有獲取鎖還是不能立即執(zhí)行,也就是說(shuō),A在喚醒操作之后,并不釋放鎖。這種方法跟 Object 的 wait() 和 notify() 一樣。
方式五:基本LockSupport實(shí)現(xiàn)線程間的阻塞和喚醒
LockSupport 是一種非常靈活的實(shí)現(xiàn)線程間阻塞和喚醒的工具,使用它不用關(guān)注是等待線程先進(jìn)行還是喚醒線程先運(yùn)行,但是得知道線程的名字。
運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的线程间通信的几种方法_并发编程中的线程间通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: verilog设计简易正弦波信号发生器_
- 下一篇: mysql的where字句调优_mysq