1

ThreadPoolExecutor を使用して、ブロッキング キューからのリクエストを処理するスレッドを起動しています。キューが空の場合、これらすべてのワーカー スレッドが待機しています。これにより、このプール内のすべてのスレッドが待機状態になります。

public ThreadPoolExecutor executor = new ThreadPoolExecutor(
                EngineConfiguration.numberOfSearchTask,
                EngineConfiguration.numberOfSearchTask + 10, 1000,
                TimeUnit.SECONDS, worksQueue, executionHandler);

また、上記のプールで現在アクティブなスレッドを取得しようとするスケジュールされた実行プログラムの下で起動し、0 の場合はプールをシャットダウンします。

final ScheduledFuture<?> scheduleFuture = scheduler
.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {
        int activeThreadCount =   executor.getActiveThreads();
        if (activeThreadCount == 0) { 

SearchTaskRunner.keepRunning.set(false);
                log.warn("shutdown task runner");

            executor.shutdown();

            log.warn("shutdown scheduler");
            scheduler.shutdownNow();




        }
    }
}, 10, 10000, TimeUnit.SECONDS);

問題は、10 秒後にスケジューラ スレッドが activeThreadCount=0 になり、プールがシャットダウンされることです。

私達はことを知っています:

getActiveCount():アクティブにタスクを実行しているスレッドのおおよその数を返します。

これは、アクティブな状態にあるスレッドの正確な数を示していない可能性があります。

とにかく、最初のプールからのすべてのスレッドが待機状態にあるかどうかを知ることはできますか?

4

2 に答える 2

3

これを使って

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
于 2013-03-04T07:26:12.407 に答える