輪詢客戶端的實現
摘要: 服務器端給第一個客戶端發送notification,然后在限定時間內,等待客戶端作出回應—向服務器發送request。如果客戶端一直沒有回復,服務器會在到達限定時間后,向第二個客戶端發送notification。如果客戶端在限定時間內回復,服務器端放棄再給其他客戶端發送消息。
Design
服務器、客戶端使用socket發送和接收信息
發送端存在一個客戶端列表,每次發送一給一個客戶端,發送后,向Helper發送添加該客戶端id的請求。
客戶端收到信息會向Helper發送刪除該id的請求。
Helper收到add時,啟動一個ScheduledExecutorService類的schedule,延時啟動一個線程,并將該schedule緩存。remove時,從緩存里取出schedule并停止它。如果在延時時間內,線程沒有被停止,它會被執行:從緩存中取出,告訴服務器向下一個客戶端發送請求。
閱讀全文
Java線程池類ThreadPoolExecutor淺析
摘要: 線程池的特點是將任務的提交和執行分開。這樣做的好處是,能使處理器盡量多地同時執行任務。
1.當工人數量沒有達到最小雇傭數量時,每當任務來臨,線程池都要創建一個工人,把工人加入工人集合。
2.如果任務來臨時,當前工人數量poolSize已經大于最小雇傭數量,線程池嘗試把任務加入任務列表,如果成功,任務提交的步驟就結束了。
2.5.工人會不斷地嘗試從隊列里獲取任務,如果獲取到任務(請看5),工人就把任務拿去執行。這是任務的執行步驟。
3.如果加入隊列失敗,再雇傭一個工人或者
4.拒絕該任務。
5.工人等待任務的策略分兩種(本文不考慮生命周期和狀態):死等!在給定時間內等。
6.沒有任務則把該工人的線程結束。
7.沒有拿到任務的工人,被清除出工人集合。
閱讀全文