推薦鏈接:
????總結(jié)——》【Java】
????總結(jié)——》【Mysql】
????總結(jié)——》【Redis】
????總結(jié)——》【Kafka】
????總結(jié)——》【Spring】
????總結(jié)——》【SpringBoot】
????總結(jié)——》【MyBatis、MyBatis-Plus】
????總結(jié)——》【Linux】
????總結(jié)——》【MongoDB】
????總結(jié)——》【Elasticsearch】
線程之間的通信有兩種方式:共享內(nèi)存
和消息傳遞
。
一、共享內(nèi)存
在共享內(nèi)存的并發(fā)模型里,線程之間共享程序的公共狀態(tài)
,線程之間通過寫-讀內(nèi)存中的公共狀態(tài)
來隱式進(jìn)行通信。
典型的共享內(nèi)存通信方式,就是通過共享對象
進(jìn)行通信。
例如線程A與線程B之間如果要通信的話,那么就必須經(jīng)歷下面兩個步驟:
- 線程A:把本地內(nèi)存A更新過的
共享變量刷新到主內(nèi)存中
去。 - 線程B:到主內(nèi)存中去
讀取線程A之前更新過的共享變量
。
二、消息傳遞
在消息傳遞的并發(fā)模型里,線程之間沒有公共狀態(tài)
,線程之間必須通過明確的發(fā)送消息
來顯式進(jìn)行通信。
在Java中典型的消息傳遞方式:
- wait()和notify()方法
- wait(long timeout)和notify()方法
- join()方法
- Lock和Condition接口
- BlockingQueue阻塞隊列
1、wait()和notify()方法
wait()方法使線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用notify()或notifyAll()方法將其喚醒。notify()方法喚醒一個等待中的線程,notifyAll()方法喚醒所有等待中的線程。
2、wait(long timeout)和notify()方法
wait(long timeout)方法使線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用notify()方法將其喚醒,或者等待時間超過指定的timeout時間。notify()方法喚醒一個等待中的線程。
3、join()方法
join()方法使一個線程等待另一個線程執(zhí)行完畢。當(dāng)一個線程調(diào)用另一個線程的join()方法時,當(dāng)前線程將被阻塞,直到另一個線程執(zhí)行完畢。
4、Lock和Condition接口
Lock接口提供了比synchronized關(guān)鍵字更靈活的鎖機(jī)制,Condition接口提供了更靈活的等待/通知機(jī)制。
通過Lock接口的lock()方法獲取鎖,unlock()方法釋放鎖。
通過Condition接口的await()方法使線程等待,signal()方法喚醒一個等待中的線程,signalAll()方法喚醒所有等待中的線程。文章來源:http://www.zghlxwxcb.cn/news/detail-703087.html
5、BlockingQueue阻塞隊列
BlockingQueue是一個支持阻塞操作的隊列。
當(dāng)隊列為空時,獲取元素的線程將被阻塞,直到隊列中有可用元素;
當(dāng)隊列滿時,插入元素的線程將被阻塞,直到隊列有空閑位置。文章來源地址http://www.zghlxwxcb.cn/news/detail-703087.html
到了這里,關(guān)于Java——》線程間是如何通信的的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!