Close

Java - ThreadPoolExecutor Examples

Java 

Demonstrating how ThreadPoolExecutor can be created with different parameters.

public class ExecutorsPoolEquivalentExamples {
public static void main (String[] args) {
//equivalent to Executors.newCachedThreadPool()
executePool(new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L,
TimeUnit.SECONDS,
new SynchronousQueue<>()),
"equivalent to Executors#newCachedThreadPool()");


//equivalent to Executors.newFixedThreadPool(int nThreads)
executePool(new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>()),
"equivalent to Executors#newFixedThreadPool(int nThreads)");


//equivalent to Executors.newSingleThreadExecutor()
executePool(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>()),
"equivalent to Executors#newSingleThreadExecutor()");

}

private static void executePool (ThreadPoolExecutor e, String msg) {
System.out.println("---- " + msg + "-------------");

for (int i = 0; i < 10; i++) {
try {
e.execute(new Task());
} catch (RejectedExecutionException ex) {
System.out.println("Task rejected = " + (i + 1));
}
printStatus(i + 1, e);
}

e.shutdownNow();

System.out.println("--------------------\n");
}

private static void printStatus (int taskSubmitted, ThreadPoolExecutor e) {


StringBuilder s = new StringBuilder();
s.append("poolSize = ")
.append(e.getPoolSize())
.append(", corePoolSize = ")
.append(e.getCorePoolSize())
.append(", queueSize = ")
.append(e.getQueue()
.size())
.append(", queueRemainingCapacity = ")
.append(e.getQueue()
.remainingCapacity())
.append(", maximumPoolSize = ")
.append(e.getMaximumPoolSize())
.append(", totalTasksSubmitted = ")
.append(taskSubmitted);

System.out.println(s.toString());


}

private static class Task implements Runnable {

@Override
public void run () {
while (true) {
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
break;
}
}
}
}
}

Output

---- equivalent to Executors#newCachedThreadPool()-------------
poolSize = 1, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 1
poolSize = 2, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 2
poolSize = 3, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 3
poolSize = 4, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 4
poolSize = 5, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 5
poolSize = 6, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 6
poolSize = 7, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 7
poolSize = 8, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 8
poolSize = 9, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 9
poolSize = 10, corePoolSize = 0, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 2147483647, totalTasksSubmitted = 10
--------------------

---- equivalent to Executors#newFixedThreadPool(int nThreads)-------------
poolSize = 1, corePoolSize = 5, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 1
poolSize = 2, corePoolSize = 5, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 2
poolSize = 3, corePoolSize = 5, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 3
poolSize = 4, corePoolSize = 5, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 4
poolSize = 5, corePoolSize = 5, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 5
poolSize = 5, corePoolSize = 5, queueSize = 1, queueRemainingCapacity = 2147483646, maximumPoolSize = 5, totalTasksSubmitted = 6
poolSize = 5, corePoolSize = 5, queueSize = 2, queueRemainingCapacity = 2147483645, maximumPoolSize = 5, totalTasksSubmitted = 7
poolSize = 5, corePoolSize = 5, queueSize = 3, queueRemainingCapacity = 2147483644, maximumPoolSize = 5, totalTasksSubmitted = 8
poolSize = 5, corePoolSize = 5, queueSize = 4, queueRemainingCapacity = 2147483643, maximumPoolSize = 5, totalTasksSubmitted = 9
poolSize = 5, corePoolSize = 5, queueSize = 5, queueRemainingCapacity = 2147483642, maximumPoolSize = 5, totalTasksSubmitted = 10
--------------------

---- equivalent to Executors#newSingleThreadExecutor()-------------
poolSize = 1, corePoolSize = 1, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 1, totalTasksSubmitted = 1
poolSize = 1, corePoolSize = 1, queueSize = 1, queueRemainingCapacity = 2147483646, maximumPoolSize = 1, totalTasksSubmitted = 2
poolSize = 1, corePoolSize = 1, queueSize = 2, queueRemainingCapacity = 2147483645, maximumPoolSize = 1, totalTasksSubmitted = 3
poolSize = 1, corePoolSize = 1, queueSize = 3, queueRemainingCapacity = 2147483644, maximumPoolSize = 1, totalTasksSubmitted = 4
poolSize = 1, corePoolSize = 1, queueSize = 4, queueRemainingCapacity = 2147483643, maximumPoolSize = 1, totalTasksSubmitted = 5
poolSize = 1, corePoolSize = 1, queueSize = 5, queueRemainingCapacity = 2147483642, maximumPoolSize = 1, totalTasksSubmitted = 6
poolSize = 1, corePoolSize = 1, queueSize = 6, queueRemainingCapacity = 2147483641, maximumPoolSize = 1, totalTasksSubmitted = 7
poolSize = 1, corePoolSize = 1, queueSize = 7, queueRemainingCapacity = 2147483640, maximumPoolSize = 1, totalTasksSubmitted = 8
poolSize = 1, corePoolSize = 1, queueSize = 8, queueRemainingCapacity = 2147483639, maximumPoolSize = 1, totalTasksSubmitted = 9
poolSize = 1, corePoolSize = 1, queueSize = 9, queueRemainingCapacity = 2147483638, maximumPoolSize = 1, totalTasksSubmitted = 10
--------------------
Original Post




Showing different queue usage.

public class ThreadPoolExecutorExample {

public static void main (String[] args) {
createAndRunPoolForQueue(new ArrayBlockingQueue<>(3), "Bounded");
createAndRunPoolForQueue(new LinkedBlockingDeque<>(), "Unbounded");
createAndRunPoolForQueue(new SynchronousQueue<>(), "Direct hand-off");
}

private static void createAndRunPoolForQueue (BlockingQueue<Runnable> queue, String msg) {
System.out.println("---- " + msg + " queue instance = " + queue.getClass() + " " +
"-------------");

ThreadPoolExecutor e = new ThreadPoolExecutor(2, 5, Long.MAX_VALUE, TimeUnit.NANOSECONDS,
queue);
for (int i = 0; i < 10; i++) {
try {
e.execute(new Task());
} catch (RejectedExecutionException ex) {
System.out.println("Task rejected = " + (i + 1));
}
printStatus(i + 1, e);
}

e.shutdownNow();

System.out.println("--------------------\n");
}

private static void printStatus (int taskSubmitted, ThreadPoolExecutor e) {


StringBuilder s = new StringBuilder();
s.append("poolSize = ")
.append(e.getPoolSize())
.append(", corePoolSize = ")
.append(e.getCorePoolSize())
.append(", queueSize = ")
.append(e.getQueue()
.size())
.append(", queueRemainingCapacity = ")
.append(e.getQueue()
.remainingCapacity())
.append(", maximumPoolSize = ")
.append(e.getMaximumPoolSize())
.append(", totalTasksSubmitted = ")
.append(taskSubmitted);

System.out.println(s.toString());


}

private static class Task implements Runnable {

@Override
public void run () {
while (true) {
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
break;
}

}
}
}
}

Output

---- Bounded queue instance = class java.util.concurrent.ArrayBlockingQueue -------------
poolSize = 1, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 3, maximumPoolSize = 5, totalTasksSubmitted = 1
poolSize = 2, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 3, maximumPoolSize = 5, totalTasksSubmitted = 2
poolSize = 2, corePoolSize = 2, queueSize = 1, queueRemainingCapacity = 2, maximumPoolSize = 5, totalTasksSubmitted = 3
poolSize = 2, corePoolSize = 2, queueSize = 2, queueRemainingCapacity = 1, maximumPoolSize = 5, totalTasksSubmitted = 4
poolSize = 2, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 5
poolSize = 3, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 6
poolSize = 4, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 7
poolSize = 5, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 8
Task rejected = 9
poolSize = 5, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 9
Task rejected = 10
poolSize = 5, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 10
--------------------

---- Unbounded queue instance = class java.util.concurrent.LinkedBlockingDeque -------------
poolSize = 1, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 1
poolSize = 2, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 2147483647, maximumPoolSize = 5, totalTasksSubmitted = 2
poolSize = 2, corePoolSize = 2, queueSize = 1, queueRemainingCapacity = 2147483646, maximumPoolSize = 5, totalTasksSubmitted = 3
poolSize = 2, corePoolSize = 2, queueSize = 2, queueRemainingCapacity = 2147483645, maximumPoolSize = 5, totalTasksSubmitted = 4
poolSize = 2, corePoolSize = 2, queueSize = 3, queueRemainingCapacity = 2147483644, maximumPoolSize = 5, totalTasksSubmitted = 5
poolSize = 2, corePoolSize = 2, queueSize = 4, queueRemainingCapacity = 2147483643, maximumPoolSize = 5, totalTasksSubmitted = 6
poolSize = 2, corePoolSize = 2, queueSize = 5, queueRemainingCapacity = 2147483642, maximumPoolSize = 5, totalTasksSubmitted = 7
poolSize = 2, corePoolSize = 2, queueSize = 6, queueRemainingCapacity = 2147483641, maximumPoolSize = 5, totalTasksSubmitted = 8
poolSize = 2, corePoolSize = 2, queueSize = 7, queueRemainingCapacity = 2147483640, maximumPoolSize = 5, totalTasksSubmitted = 9
poolSize = 2, corePoolSize = 2, queueSize = 8, queueRemainingCapacity = 2147483639, maximumPoolSize = 5, totalTasksSubmitted = 10
--------------------

---- Direct hand-off queue instance = class java.util.concurrent.SynchronousQueue -------------
poolSize = 1, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 1
poolSize = 2, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 2
poolSize = 3, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 3
poolSize = 4, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 4
poolSize = 5, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 5
Task rejected = 6
poolSize = 5, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 6
Task rejected = 7
poolSize = 5, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 7
Task rejected = 8
poolSize = 5, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 8
Task rejected = 9
poolSize = 5, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 9
Task rejected = 10
poolSize = 5, corePoolSize = 2, queueSize = 0, queueRemainingCapacity = 0, maximumPoolSize = 5, totalTasksSubmitted = 10
--------------------
Original Post




See Also