2012-11-21 43 views
1

在Java中,我有一種情況,許多TCP連接(MINA)正在爲給定線程創建工作,有時此線程變得過度勞累,排隊和後退。我想知道在這個過程中監控這個問題的好方法,這樣當應用程序的線程陷入困境時,應用程序可以減少它的工作量。基本上,我知道這樣做的唯一方法是將監控任務放在線程上,偶爾輪詢以查看它們是否已完成,但我覺得應該有更直接的東西。檢測線程是否排隊/過度勞累

回答

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非常抽象,所以我的答案是從鳥的角度來看)直到隊列開始清除

相關問題