Sunday, 19 June 2011

CachedThreadPool Example

This article will discuss about Thread pool that can reuse previously constructed threads when they are available. From Java 5.0+ one can get such pool from Executors using following method –
public static ExecutorService newCachedThreadPool();

Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available.So this means number of threads provided by cached thread pool is unbounded. So we can put it like this:
Creates an unbounded thread pool with automatic thread reclamation.

These pools will typically improve the performance of programs that execute many short-lived asynchronous tasks. Calls to execute will reuse previously constructed threads if available. If no existing thread is available, a new thread will be created and added to the pool. Threads that have not been used for sixty seconds are terminated and removed from the cache. Thus, a pool that remains idle for long enough will not consume any resources. Note that pools with similar properties but different details (for example, timeout parameters) may be created using ThreadPoolExecutor constructors.

Example
Here is a runnable task called WorkerThread (in a .java source file). The task performs some work and then periodically reports what percent of the work it has completed.
public class WorkerThread implements Runnable {
private int workerNumber;

WorkerThread(int number) {
workerNumber = number;
}

public void run() {
for (int i=0;i<=100;i+=20) {
//Perform some work...
System.out.format("Worker number: %d, percent complete: %d%n",
workerNumber, i);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) { }
}
}
}

CachedThreadPoolDemo uses the CachedThreadPool executor service, which creates as many threads as needed but reuses previously constructed threads if available. You use the submit method to ask an executor service to run a Callable. This method returns a Future (in the API reference documentation) object, which gives you control over the task; you can use Future to retrieve the result of running the task, to monitor the task, and to cancel the task. For example, to gain access to the return result, simply call the method get.
public class CachedThreadPoolDemo {
public static void main(String[] args) {
int numWorkers = Integer.parseInt(args[0]);

ExecutorService tpes =
Executors.newCachedThreadPool();
CallableWorkerThread workers[] =
new CallableWorkerThread[numWorkers];
Future<Integer> futures[] = new Future[numWorkers];

for (int i = 0; i < numWorkers; i++) {
workers[i] = new CallableWorkerThread(i);
futures[i]=tpes.submit(workers[i]);
}

for (int i = 0; i < numWorkers; i++) {
try {
System.out.format("Ending worker: %d%n",
futures[i].get());
} catch (Exception e) {}
}
}
}

Output
Here is the output :
Worker number: 0, percent complete: 0
Worker number: 1, percent complete: 0
Worker number: 2, percent complete: 0
Worker number: 3, percent complete: 0
Worker number: 3, percent complete: 20
Worker number: 3, percent complete: 40
Worker number: 3, percent complete: 60
Worker number: 1, percent complete: 20
Worker number: 0, percent complete: 20
Worker number: 1, percent complete: 40
Worker number: 2, percent complete: 20
Worker number: 3, percent complete: 80
Worker number: 0, percent complete: 40
Worker number: 2, percent complete: 40
Worker number: 2, percent complete: 60
Worker number: 1, percent complete: 60
Worker number: 3, percent complete: 100
Worker number: 2, percent complete: 80
Worker number: 2, percent complete: 100
Worker number: 0, percent complete: 60
Worker number: 0, percent complete: 80
Worker number: 0, percent complete: 100
Worker number: 1, percent complete: 80
Ending worker: 0
Worker number: 1, percent complete: 100
Ending worker: 1
Ending worker: 2
Ending worker: 3


No comments:

Post a Comment