我正在使用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():返回大致的线程数 积极执行任务。
这可能无法使准确数量的线程处于活动状态。
无论如何我知道第一个池中的所有线程是否处于等待状态?
答案 0 :(得分:2)
使用此
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
答案 1 :(得分:0)
使用此代码获取所有正在运行的线程并将set转换为数组
Set<Thread> tSet = Thread.getAllStackTraces().keySet();
Thread[] tArray = tSet.toArray(new Thread[tSet.size()]);