No, by default ThreadPoolExecutor does not block when the queue is
full. It throws a RejectedExecutionException.
If you run the code below you will see that happen.
<snip code>
I see what you mean. What you need to do is use a second queue to
manage your flow control. I wrote a quick example...
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.LinkedBlockingQueue;
public class ThreadPoolExecutorBlockTest
{
public static void main(String[] args)
{
final BlockingQueue<Runnable> queue = new
ArrayBlockingQueue<Runnable>(20, true);
final Executor executor = new ThreadPoolExecutor(10, 10, 1000,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
new Thread(new Runnable()
{
public void run()
{
while(true)
{
try
{
executor.execute(queue.take());
}
catch (InterruptedException e)
{
//Ignore and repeat loop
}
}
}
}).start();
for(int i = 0; i < 30; i++)
{
try
{
queue.put(new Printer(i));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private static class Printer implements Runnable
{
private int number;
public Printer(int number)
{
this.number = number;
}
public void run()
{
System.out.println("Running task: " + number);
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
Yeah, but that code will basically be in a busy wait loop. It will
constantly have an exception thrown, recaught and retried. By using a
until it can actually do something. I think your example would eat the