溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java如何在兩個(gè)線程間進(jìn)行通訊

發(fā)布時(shí)間:2021-12-20 14:06:13 來(lái)源:億速云 閱讀:342 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“Java如何在兩個(gè)線程間進(jìn)行通訊”,在日常操作中,相信很多人在Java如何在兩個(gè)線程間進(jìn)行通訊問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java如何在兩個(gè)線程間進(jìn)行通訊”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

在并發(fā)編程中,我們必須考慮的問(wèn)題時(shí)如何在兩個(gè)線程間進(jìn)行通訊。這里的通訊指的是不同的線程之間如何交換信息。
目前有兩種方式:

  1. 共享內(nèi)存

  2. 消息傳遞(actor 模型)

#共享內(nèi)存
共享內(nèi)存這種方式比較常見(jiàn),我們經(jīng)常會(huì)設(shè)置一個(gè)共享變量。然后多個(gè)線程去操作同一個(gè)共享變量。從而達(dá)到線程通訊的目的。例如,我們使用多個(gè)線程去執(zhí)行頁(yè)面抓取任務(wù),我們可以使用一個(gè)共享變量count來(lái)記錄任務(wù)完成的數(shù)量。每當(dāng)一個(gè)線程完成抓取任務(wù),會(huì)在原來(lái)的count上執(zhí)行加1操作。這樣每個(gè)線程都可以通過(guò)獲取這個(gè)count變量來(lái)獲得當(dāng)前任務(wù)的完成情況。當(dāng)然必須要考慮的是共享變量的同步問(wèn)題,這也共享內(nèi)存容易出錯(cuò)的原因所在。
Java如何在兩個(gè)線程間進(jìn)行通訊
這種通訊模型中,不同的線程之間是沒(méi)有直接聯(lián)系的。都是通過(guò)共享變量這個(gè)“中間人”來(lái)進(jìn)行交互。而這個(gè)“中間人”必要情況下還需被保護(hù)在臨界區(qū)內(nèi)(加鎖或同步)。由此可見(jiàn),一旦共享變量變得多起來(lái),并且涉及到多種不同線程對(duì)象的交互,這種管理會(huì)變得非常復(fù)雜,極容易出現(xiàn)死鎖等問(wèn)題。
給出案例

#消息傳遞
消息傳遞方式采取的是線程之間的直接通信,不同的線程之間通過(guò)顯式的發(fā)送消息來(lái)達(dá)到交互目的。消息傳遞最有名的方式應(yīng)該是actor模型了。在這種模型下,一切都是actor,所有的actor之間的通信都必須通過(guò)傳遞消息才能達(dá)到。每個(gè)actor都有一個(gè)收件箱(消息隊(duì)列)用來(lái)保存收到其他actor傳遞來(lái)的消息。actor自己也可以給自己發(fā)送消息。這才是面向?qū)ο蟮木璋。?br/> Java如何在兩個(gè)線程間進(jìn)行通訊
這種模型看起來(lái)比共享內(nèi)存模型要復(fù)雜。但是一旦碰到復(fù)雜業(yè)務(wù)的話,actor模型的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。我們還是以剛才多線程抓取網(wǎng)站為例子看一下在這種模型下如何去解決。
首先我們定義一個(gè)統(tǒng)計(jì)actor用來(lái)統(tǒng)計(jì)任務(wù)完成量。然后把多個(gè)網(wǎng)址(消息方式)發(fā)給多個(gè)抓取actor,抓取actor處理完任務(wù)后發(fā)送消息通知統(tǒng)計(jì)actor任務(wù)完成,統(tǒng)計(jì)actor對(duì)自己保存的變量count(這個(gè)只有統(tǒng)計(jì)actor才能看到)加一。
最后讓我們來(lái)總結(jié)一下這兩種通訊模式:

并發(fā)模型通信機(jī)制同步機(jī)制
共享內(nèi)存線程之間共享程序的公共狀態(tài),線程之間通過(guò)寫(xiě)-讀內(nèi)存中的公共狀態(tài)來(lái)隱式進(jìn)行通信同步是顯式進(jìn)行的。程序員必須顯式指定某個(gè)方法或某段代碼需要在線程之間互斥執(zhí)行。
消息傳遞(actor)線程之間沒(méi)有公共狀態(tài),線程之間必須通過(guò)明確的發(fā)送消息來(lái)顯式進(jìn)行通信.由于消息的發(fā)送必須在消息的接收之前,因此同步是隱式進(jìn)行的。

到此,關(guān)于“Java如何在兩個(gè)線程間進(jìn)行通訊”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI