如何获取当前正在运行的线程

时间:2013-03-04 07:24:17

标签: java multithreading scheduled-tasks threadpoolexecutor

我正在使用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():返回大致的线程数   积极执行任务。

这可能无法使准确数量的线程处于活动状态。

无论如何我知道第一个池中的所有线程是否处于等待状态?

2 个答案:

答案 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()]);