在Java中,我有一種情況,許多TCP連接(MINA)正在爲給定線程創建工作,有時此線程變得過度勞累,排隊和後退。我想知道在這個過程中監控這個問題的好方法,這樣當應用程序的線程陷入困境時,應用程序可以減少它的工作量。基本上,我知道這樣做的唯一方法是將監控任務放在線程上,偶爾輪詢以查看它們是否已完成,但我覺得應該有更直接的東西。檢測線程是否排隊/過度勞累
1
A
回答
2
我認爲訣竅在於而不是爲一個線程排隊工作,而是讓一個線程池在你的任務上工作。然後,您可以更好地平衡處理任務的線程數量。
您可能想要設置線程的初始數量,但是如果阻塞隊列填滿,則可以增大它。認識到隊列必須填滿之前第一個線程超過初始大小被分配是很重要的。我知道這是違反直覺的,但這是它的工作方式。
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(QUEUE_SIZE);
ExecutorService threadPool = new ThreadPoolExecutor(NUM_INITIAL_THREADSs,
MAX_NUM_THREADS, 0L, TimeUnit.MILLISECONDS, queue);
...
// submit the jobs...
// after submitting the jobs, you need to shutdown the queue
threadPool.shutdown();
正如@Cratylus提到的,你可以結合你的隊列,以便更多的就業機會不會被放入隊列,除非有房。這會減慢工作生產者的速度,但不會讓事情跑得更快。在定義線程池之後,您可以設置一個拒絕處理程序,它將阻止生產者而不是拋出異常。
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// this will block if the queue is full
executor.getQueue().put(r);
}
});
0
如果我正確理解任務排隊等待由線程處理,並且您需要一種方法來確保隊列不會隨着工作負載增加而無限增長,而線程無法趕上。
你可以使用一個有界的隊列,這樣一旦隊列達到了能力,你就知道線程無法應付,並且你等待/減少工作量(你的OP非常抽象,所以我的答案是從鳥的角度來看)直到隊列開始清除
相關問題
- 1. 設計模式:勞累過度還是值得? (.NET 3.5/4.x)
- 2. 檢測角度是否超過180度
- 3. Linux:如何檢測一個進程是否過度顛簸?
- 4. 多線程和排隊
- 5. 排隊黑莓線程
- 6. Python 3線程和排隊
- 7. 調度隊列中使用dispatch_semaphore_wait時線程是否餓死?
- 8. 線程池是否會排隊定時器的回調函數,有時會同時調度多個線程?
- 9. 優先隊列是否真的排隊?
- 10. Windows Azure服務總線如何排隊重複檢測工作?
- 11. 檢測過程是否是系統進程或不
- 12. 如何檢測機器是否在線?
- 13. 檢測鼠標是否無線
- 14. 一次調用過程調度程序隊列/後臺線程
- 15. Android:讓線程在AlarmBroarcastReceiver中一個一個排隊排隊
- 16. Queue.SyncRoot是否需要跨線程簡單入隊/出隊?
- 17. 檢測dragup或拖累
- 18. 檢測用戶是否畫過給定的線
- 19. 如何檢測滾動值是否超過窗口高度?
- 20. 如何檢測文本編輯是否過度擬合?
- 21. WP7檢測線程
- 22. 如何將perl子例程排隊到線程隊列而不是數據?
- 23. 如何在此課程中檢測過程是否完成?
- 24. 如何檢測我們是否在UI線程上?
- 25. 檢測一個線程是否正在運行java fx
- 26. 無論如何檢測線程方法是否已完成
- 27. 單線程JavaScript來檢測是否安裝了閃存
- 28. 如何檢測線程是否有窗口句柄?
- 29. 可以檢測活動是否已暫停? (線程問題)
- 30. 如何檢測ThreadPool中是否有空閒線程?