(2) Channel使用send和receive方法向管道中寫入和讀取數據,這些方法是非阻塞的掛起函數;
(3)信道是壹個熱流,不管有沒有訂戶,上遊都會傳輸數據。
(1)我們發現這樣,其實我們壹直在等待讀取通道中的數據,只要有數據就會被讀取;
②最後壹行做完了!如果沒有打印出來,說明程序還沒有結束,壹直在等待讀取數據。
(1)調用close方法就像向通道發送壹個特殊的close指令。這種叠代停止,表明已經接收到關閉指令;
(2)可以保證在信道關閉之前可以接收到所有先前發送的元素;
(3)調用close會立即停止接受新元素,isClosedForSend會立即返回true。但是,由於通道緩沖區的存在,此時可能不會處理某些元素,因此isClosedForReceive只有在讀取了所有元素後才會返回true。
(1)通道是壹個接口,它繼承了兩個接口:SendChannel和ReceiveChannel。
(2) SendChannel提供傳輸數據的功能,主要接口如下:
-send是壹個掛起函數,它將指定的元素發送到該通道,並在該通道的緩沖區已滿或不存在時掛起調用方。如果通道關閉,則在發送調用時會拋出異常;
-trySend在不違反其容量限制的情況下,立即將指定元素添加到此通道,並返回成功。否則,返回失敗或關閉;
-close關閉通道;
-isClosedForSend確定通道是否已關閉。如果它是關閉的,調用send將拋出異常。
(3) ReceiveChannel提供接收數據的功能,主要接口如下:
-receive如果該通道不為空,則從該通道中檢索和刪除元素;如果通道為空,調用方被掛起;如果通道在沒有接收的情況下關閉,則會引發ClosedReceiveChannel異常;
-tryReceive如果該通道不為空,則從中檢索和刪除元素,並返回成功結果;如果通道為空,則返回失敗結果;如果通道關閉,則返回關閉結果;
-receiveCatching如果此通道不為空,則從其中檢索和刪除元素,並返回成功結果;如果通道為空,則返回失敗結果;如果通道關閉,則返回關閉原因;
-isEmpty判斷通道是否為空;
-isClosedForReceive確定通道是否已關閉。如果是關閉的,調用receive會拋出異常;
- cancel(原因:CancellationException?= null)出於可選原因取消接收該信道的剩余元素。此函數用於關閉通道並刪除其中所有緩沖的元素;
-iterator()返回通道的叠代器。
(4)創建不同類型的渠道
-集合通道0大小的緩沖區(默認類型)
-無限通道無限元素,發送不暫停。
-Buffered channel指定大小,當它已滿時,發送掛起。
-沖突的通道新元素將覆蓋舊元素,接收方將只獲得最新的元素,發送將永遠不會掛起。
(1)通過produce方法啟動壹個生產者進程,並返回壹個ReceiveChannel,這樣其他進程就可以利用這個通道接收數據;
(2) actor可以用來建立壹個消費者契約,返回壹個發送通道,這樣其他契約就可以使用這個通道發送數據。
(1) BroadcastChannel被標記為過時,請使用SharedFlow和StateFlow替換它。
(2)1中的例子提到了壹對多的情況。從數據處理本身來說,當有多個接收方時,同壹元素只會被壹個接收方讀取;而BroadcastChannel不是,多個接收方之間不存在互斥。
使用broadcast()擴展函數將頻道轉換為BroadcastChannel。