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