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

时间:2010-04-17 09:59:21

标签: java multithreading threadpool

我试图尽可能快地从数据库表中获取任务队列,同时还限制处理任务的线程数。
我使用固定大小的线程池与 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) ) );
    }
}

2 个答案:

答案 0 :(得分:7)

你不应该向遗嘱执行人提交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分钟,根据您的情况进行调整。不鼓励等待,所以想想你的任务有某种合理的超时。

答案 1 :(得分:6)

ExecutorService可以帮助您完成所有工作。如果所有线程当前正被其他任务使用,则新任务将被放入队列中并在稍后的某个时间处理。即使当前正在使用所有线程,您的主线程也不会在提交新任务时阻塞。

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

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

    while( results.next() ) {
        // If all threads are in use, the new task will be queued
        executor.submit( new runnableInheritedClass(results) );
    }