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 回答
0

使用此代码获取所有正在运行的线程并将集合转换为数组

Set<Thread> tSet = Thread.getAllStackTraces().keySet();
Thread[] tArray = tSet.toArray(new Thread[tSet.size()]);
于 2017-06-27T11:27:09.420 回答