亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

回調在 NIO.2 庫中的行為如何

回調在 NIO.2 庫中的行為如何

絕地無雙 2021-12-10 16:47:35
我正在構建一個小型客戶端/服務器聊天應用程序。我NIO.2在嘗試使用經典NIO庫模擬它后遇到了它。我使用 classisc NIO 對 NIO.2 庫進行“模擬”的目標是在通過 a 成對連接的多個線程中使用多個選擇器ArrayBlockingQueue,以避免網絡讀寫時間。我的問題是,如何在 NIO.2 庫中使用AsynchronousSocketChannels和CompletionHandlers(根據我的理解作為回調)同時處理多個事件?經典的NIOlib 使用Selectorswhich 在select調用 a后交付key set。這key set然后可以遍歷每個事件(閱讀,接受并寫入)可以處理一個又一個。在NIO.2另一方面回調,沒有這樣的序列。它們是異步的。那么,例如,如果 2 個客戶端在同一時刻向服務器發送消息,會發生什么?那么 2 個回調是否同時運行?如果是,那么如何?它們是否都在單獨的線程中運行?如果我要從每個回調中獲取這些消息并嘗試將它們排入隊列,如前所述ArrayBlockingQueue,它們會相互等待嗎?
查看完整描述

1 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

那么,例如,如果 2 個客戶端在同一時刻向服務器發送消息,會發生什么?

客戶端不與服務器共享公共連接。在服務器端,您會AsynchronousSocketChannel#read為兩個客戶端調用回調,當一些字節到達時會觸發。

出于這個原因,兩個回調可以同時運行(因為它們是異步的),但它們對于每個客戶端仍然是獨立的,所以不會有問題。

它們是否都在單獨的線程中運行?

這取決于 backingAsynchronousChannelGroup的線程池(您可以自己指定或使用默認組)。

我用 NIO.2 創建了一個簡單的網絡庫,我認為它會幫助你:https : //github.com/jhg023/SimpleNet


查看完整回答
反對 回復 2021-12-10
  • 1 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號