線程之前如何通信

線程之間爲什麼要進行通信
線程是操作系統調度的最小單位,有自己的棧(JVM中的虛擬機stack)空間,可以按照既定的代碼逐步的執行,但是如果每個線程間都孤立的運行,那就會造資源浪費。所以在現實中,我們需要這些線程間可以按照指定的規則共同完成一件任務,所以這些線程之間就需要互相協調,這個過程被稱爲線程的通信。

多個線程併發執行時, 在默認情況下CPU是隨機切換線程的,當我們需要多個線程來共同完成一件任務,並且我們希望他們有規律的執行, 那麼多線程之間需要一些協調通信,以此來幫我們達到多線程共同操作一份數據。

當然如果我們沒有使用線程通信來使用多線程共同操作同一份數據的話,雖然可以實現,但是在很大程度會造成多線程之間對同一共享變量的爭奪,那樣的話勢必爲造成很多錯誤和損失!

所以,我們才引出了線程之間的通信,多線程之間的通信能夠避免對同一共享變量的爭奪。

線程的通信可以被定義爲:線程通信就是當多個線程共同操作共享的資源時,互相告知自己的狀態以避免資源爭奪。

線程通信的方式
線程通信主要可以分爲三種方式,分別爲共享內存、消息傳遞(也叫等待-通知)和管道流。每種方式有不同的方法來實現。在Java中線程之間的通信方式總共有8種,分別是:volatile、synchronized、interrupt、wait、notify、notifyAll、join、管道輸入/輸出

共享內存:線程之間共享程序的公共狀態,線程之間通過 讀-寫 內存中的公共狀態來隱式通信。比如 volatile 保證內存的可見性。

消息傳遞:線程之間沒有公共的狀態,線程之間必須通過明確的發送信息來顯示的進行通信。比如 wait/notify/notifyAll等待通知方式和join方式。

多個線程在處理同一個資源,並且任務不同時,需要線程通信來幫助解決線程之間對同一個變量的使用或操作。 就是多個線程在操作同一份數據時, 避免對同一共享變量的爭奪。於是我們引出了等待喚醒機制:(wait()、notify())。notifyAll的使用情景是存在多個生產者和消費者。

等待通知機制是基於wait和notify方法來實現的,在一個線程內調用該線程鎖對象的wait方法,線程將進入等待隊列進行等待直到被通知或者被喚醒。

管道流:管道流是是一種使用比較少的線程間通信方式,管道輸入/輸出流和普通文件輸入/輸出流或者網絡輸出/輸出流不同之處在於,它主要用於線程之間的數據傳輸,傳輸的媒介爲管道。比如 管道輸入/輸出

管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream進行通信。像消息傳遞機制,也就是說:通過管道,將一個線程中的消息發送給另一個。

原文鏈接:https://blog.csdn.net/weixin_46487176/article/details/122995466

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章