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