2013-08-16 13 views
6

私は、SpringでThreadPoolTask​​Executorを使用してタスクをスケジュールします。ThreadPoolTask​​Executor内のすべての実行中/待機中のスレッドを一覧表示する

タスクエグゼキュータ/プールの実行中および待機中のすべてのスレッドのリストなどを取得する方法はありますか?

+0

何を達成したいですか? 'getActiveCount()'は、正しくアクティブなスレッドの数を返します。 'getPoolSize()'はプール内のスレッド数を返します。何がもっと必要ですか?なぜ? –

+1

'ThreadPoolTask​​Executor#.getThreadPoolExecutor()。getQueue()'状態_このエグゼキュータによって使用されるタスクキューを返します。タスクキューへのアクセスは、主にデバッグと監視を目的としています。このキューはアクティブに使用されている可能性があります。タスクキューを取得しても、キューに入れられたタスクは実行されません._ –

+1

@JBNizet私のアプリケーションで何が起こっているか知りたいです;) –

答えて

2

これはあまりエレガントではないかもしれませんが、この方法では、既知のExecutor(startsWith()接頭辞を使用)からすべてのスレッドを取得できます。彼のヒントのSurveonへ

Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
for (Thread thread : threadSet) { 
    if (thread.getName().startsWith("MyExecutor")) { 
    System.out.println(thread.getName() + " " + thread.getState()); 
    for (StackTraceElement s : thread.getStackTrace()) { 
     System.out.println(s); 
    } 
    } 
} 

おかげで、私はキューに入れられたスレッドを取得するために彼のapprochためupvoted。

0

1つの可能な方法は、リフレクションを使用することですか、春は一つ以上の睡眠スレッドが中断されたとき、私はシナリオをテストするために、私のJUnitのでReflectionTestUtilsを使用..

をReflectionUtilsかReflectionTestUtilsを提供します。

コードスニペットは、次のとおりです。

Collection<Object> workers = (Collection<Object>) ReflectionTestUtils.getField(responseHandlerTaskExecutor.getThreadPoolExecutor(), "workers"); 

for(Object worker : workers){ 
    Thread workerThread = (Thread)ReflectionTestUtils.getField(worker, "thread"); 
    workerThread.interrupt(); 
} 
関連する問題