2015-10-26 11 views
5

java executorService(つまりスレッドプール)を使用して実装された複数のワーカースレッドを持つサーバーがありますexecutor service pool(JAVA)からスレッドを待っているジョブの数を調べる

私の問題は、毎秒ログに記録できないことです。スレッドプールから利用可能なアイドルスレッドはありません。

注:ロギングは私の問題ではありませんが、ワーカースレッドによって処理されるのを待っているタスク/ジョブの数を確認できます。スレッドプールではなく待ちキューの長さを確認できます)executorサービスの中に?

私はこのことをどのように実装するか考えていません。

答えて

12

ThreadPoolExecutorコンストラクタは、待機中のジョブを格納するために使用されるQueue実装であるBlockingQueueパラメータを受け入れます。これではなくExecutors.newFixedThreadPoolや友人を使用しての明示的ThreadPoolExecutorを構築する方が良いでしょう、この方法はExecutorServiceインタフェースでは使用できないことを

System.out.println("Number of waiting jobs: "+executor.getQueue().size()); 

注:あなたは、キューのサイズを確認getQueue()方法を使用してこのキューを要求することができます:

ThreadPoolExecutor executor = new ThreadPoolExecutor(nThreads, nThreads, 
            0L, TimeUnit.MILLISECONDS, 
            new LinkedBlockingQueue<Runnable>()); 

OpenJDKの/ OracleJDKでExecutors.newFixedThreadPoolが同じことをしている間は、それはこのように、将来のバージョンのJavaまたは代替JDK実装でClassCastExceptionを引き起こす可能性が(ThreadPoolExecutor)Executors.newFixedThreadPool(nThreads)を使用して、指定されていません。

+0

を助け

ThreadPoolExecutor

BlockingQueue

希望を参照してください。また、arrayblockingqueueからいくつかのリソースをポーリングするために待機しているスレッドの数を取得する方法はありますか? – LoveMeow

+0

@LoveMeow、私は疑いがあります。しかし、 'ThreadPoolExecutor'の' getTaskCount() '、' getActiveCount() 'などの他のメソッドをチェックすることができます。おそらくあなたの質問に答えます。 –

3

ご使用のサーバーで使用されるExecutorService実装がThreadPoolExecutorであると仮定することができるならば、あなたはまだWorkerに割り当てられていないタスクの数を返すメソッドgetQueue()を使用することができます。ただ、代わりにExecutorServiceの提案の使用ThreadPoolExecutorとして

if(LOGGER.isDebugEnabled()) { 
    LOGGER.debug(String.format("Pending tasks: %d", executor.getQueue().size())); 
} 
0

/** 
* Returns the task queue used by this executor. Access to the 
* task queue is intended primarily for debugging and monitoring. 
* This queue may be in active use. Retrieving the task queue 
* does not prevent queued tasks from executing. 
* 
* @return the task queue 
*/ 
public BlockingQueue<Runnable> getQueue() { 
    return workQueue; 
} 

ですから、このような何かを実行することができます。 ThreadPoolExecutorクラスにあるブロッキングキューを利用できます。これにより、待機しているスレッドの数がわかります。

ThreadPoolExecutorクラスには、サブミットされたタスクと実行されたタスクの数を取得するメソッドがあります。

これは

関連する問題