首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 伺服器端 Socket 線程池完整實作:動態調整、監控與優雅關閉

     編輯:Java 相關知識

設計目標

  • 限制最大併發執行緒數,防止資源耗盡。
  • 維護核心空閒執行緒,降低頻繁建立/銷毀開銷。
  • 任務隊列滿時阻塞等待,支援超時機制。
  • 監控執行緒定期回收多餘空閒執行緒。
  • 支援優雅關閉:停止接收新任務、等待執行中任務完成、釋放資源。

核心類別 ThreadPool 關鍵欄位

protected Vector pool;              // 空閒執行緒隊列
protected MonitorRunnable monitor;  // 監控執行緒
protected int maxThreads = 100;     // 最大執行緒數
protected int minSpareThreads = 10; // 最小空閒數
protected int maxSpareThreads = 50; // 最大空閒數
protected int currentThreadCount;   // 當前總執行緒數
protected int currentThreadsBusy;   // 忙碌執行緒數
protected boolean stopThePool;      // 關閉標誌

主要流程

啟動 start()

  1. 調整參數上下界 adjustLimits()。
  2. 建立初始空閒執行緒 openThreads(minSpareThreads)。
  3. 啟動 MonitorRunnable 監控執行緒。

提交任務 runIt(Socket cs)

  1. 若無空閒執行緒且未達 maxThreads,擴充 minSpareThreads 個執行緒。
  2. 若已達上限,呼叫 wait() 阻塞等待空閒執行緒(可被 notifyAll() 喚醒)。
  3. 從空閒隊列取出最後一個 ControlRunnable,標記為忙碌,呼叫其 runIt(cs) 處理 Socket。

任務完成回收 returnController(ControlRunnable)

  1. 忙碌計數 -1,將執行緒放回空閒隊列尾端。
  2. notifyAll() 喚醒等待中的提交執行緒。

監控執行緒 MonitorRunnable

  • 每 WORK_WAIT_TIMEOUT (60秒) 喚醒一次。
  • 呼叫 checkSpareControllers():若空閒數 > maxSpareThreads,終止多餘執行緒並從隊列移除。

優雅關閉 shutdown()

  1. 設定 stopThePool=true,終止監控執行緒。
  2. 終止所有空閒執行緒。
  3. notifyAll() 喚醒所有等待執行緒拋出 IllegalStateException。

完整原始碼

(原文提供完整 ThreadPool、ControlRunnable、MonitorRunnable 實作,此處略去重複,核心邏輯如上。)

使用建議

  • 根據硬體核心數與業務型別(CPU 密集 vs IO 密集)調整 maxThreads。
  • 生產環境建議加入執行緒池監控指標(隊列長度、活躍數、拒絕次數)。
  • JDK 1.5+ 專案優先考慮 java.util.concurrent.ThreadPoolExecutor,功能更完善、經過充分測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved