加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 05:04:35 所属栏目:Java 来源:网络整理
导读:我试图尽可能快地从数据库表中获取任务队列,同时还限制处理任务的线程数. 我使用Executors.newFixedThreadPool(N)固定大小的线程池; 我想知道是否有一种方法可以知道线程池是否已满,我的意思是当前有50个线程正在运行,如果是,那么我会等待一个线程在开始一个
我试图尽可能快地从数据库表中获取任务队列,同时还限制处理任务的线程数.
我使用Executors.newFixedThreadPool(N)固定大小的线程池;

我想知道是否有一种方法可以知道线程池是否已满,我的意思是当前有50个线程正在运行,如果是,那么我会等待一个线程在开始一个新线程之前可用而不是睡觉主线程.

我想做的代码:

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担心线程处理.当所有线程都忙时,它将自动排队Runnables,当一个任务完成时,它将从队列中获取等待任务.

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

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分钟,根据您的情况进行调整.不鼓励等待,所以想想你的任务有某种合理的超时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读