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

Art*_*bin 3 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) ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*ies 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);
Run Code Online (Sandbox Code Playgroud)

这将允许所有任务完成10分钟,根据您的情况进行调整.不鼓励等待,所以想想你的任务有某种合理的超时.


Mat*_*ler 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) );
    }
Run Code Online (Sandbox Code Playgroud)