afr*_*gba 6 java multithreading executorservice threadpoolexecutor
所以我使用executorservice来创建一个线程池.
ExecutorService executor = Executors.newSingleThreadExecutor();
Run Code Online (Sandbox Code Playgroud)
我试图访问线程池队列中的任务数.我看到没有方法可以做到这一点.我知道有一些方法可以在threadpoolexecutor中获取队列大小,但是如何使用executorservice对象来实现这一点.
就像我说的,如果我创建了像这样的ThreadpoolExecutor,我可以获取队列信息
ThreadPoolExecutor tpExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用tpExecutor.queue.size()来获取threadpool队列中的任务数.但是目前我已经使用Executor Service声明了我的线程池.我怎样才能做到这一点?如果人们可以编写代码并进行演示,那将是值得注意的.
我认为这应该有效:
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) this.executorService;
int activeCount = threadPoolExecutor.getActiveCount();
long taskCount = threadPoolExecutor.getTaskCount();
long completedTaskCount = threadPoolExecutor.getCompletedTaskCount();
long tasksToDo = taskCount - completedTaskCount - activeCount;
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它并不总是排除所有已取消的任务,只有在进行一些定期清理之后才会排除。所以我不得不引入第二个计数器:
long tasksToDo2 = threadPoolExecutor.getQueue().stream().filter(t -> !((FutureTask) t).isDone()).count();
Run Code Online (Sandbox Code Playgroud)
小智 -1
您可以将其强制转换为 ThreadPoolExecutor。
ThreadPoolExecutor ex=(ThreadPoolExecutor)执行器;ex.getQueue().size();