gpt4 book ai didi

java - java中如何判断线程池中是否有可用线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:41 25 4
gpt4 key购买 nike

我正在尝试尽可能快地处理来自数据库表的任务队列,同时还限制处理任务的线程数。
我正在使用固定大小的线程池和 Executors.newFixedThreadPool(N);

我想知道是否有办法知道线程池是否已满,我的意思是当前是否有 50 个线程在运行,如果是这样,那么我将等待一个线程可用,然后再启动一个新线程而不是 hibernate 主线程。

我想做的代码:

ExecutorService executor = Executors.newFixedThreadPool(N);
ResultSet results;

while( true ) {
results = getWaitingTasksStmt.executeQuery();

while( results.next() && executor.notFull() ) {
executor.submit( new thread( new runnableInheritedClass(results) ) );
}
}

最佳答案

您不应该向执行器提交一个 Thread 对象,这会否定它的全部目的。您应该提交 Runnable 对象并让 Executor 担心 Thread 处理。当所有线程都忙时,它会自动将您的 Runnable 排队,当一个任务完成时,它会从队列中抓取一个等待任务。

所以你的代码应该看起来更像这样:

ExecutorService executor = Executors.newFixedThreadPool(N);

ResultSet results = getWaitingTasksStmt.executeQuery();

while( results.next() ) {
executor.submit(new RunnableInheritedClass(results) ) );
}

executor.shutdown();
executor.awaitTermination(10, TimeUnit.MINUTES);

这将允许 10 分钟完成所有任务,根据您的情况进行调整。不鼓励永远等待,因此请为您的任务考虑某种合理的超时。

关于java - java中如何判断线程池中是否有可用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com