I am trying to proccess a queue of tasks from a database table as fast as possible while also limiting the number of threads to process the tasks.
I am using a fixed sized thread pool with Executors.newFixedThreadPool(N);
I want to know if there is a way of knowing if the thread pool is full, by that I mean are there currently 50 threads running, if so then I’ll wait for a thread to be available before starting a new one instead of sleeping the main thread.
Code of what I would like to do:
ExecutorService executor = Executors.newFixedThreadPool(N);
ResultSet results;
while( true ) {
results = getWaitingTasksStmt.executeQuery();
while( results.next() && executor.notFull() ) {
executor.submit( new thread( new runnableInheritedClass(results) ) );
}
}
You should not submit a
Threadobject to the executor, that negates its entire purpose. You should submitRunnableobjects and let theExecutorworry about theThreadhandling. It will automatically queue up yourRunnables when all threads are busy and when one task is complete it will grab a waiting task from the queue.So your code should look more like this:
This will allow 10 minutes for all tasks to complete, adjust as neccesary for your situatioin. Waiting forever is discouraged so think of some kind of reasonable timeout for your tasks.