I\'ve created a pool of 4 worker threads to process some files. In the test there\'s about 200 of them. The thread pool version is already about 3 times faster than doing it
You can use an object pool for your message digest objects. And set the pool size to 4 in your case.
apache commons provides excellent pool api: http://commons.apache.org/pool/
Extend ThreadLocal
for your class and override the initialValue()
method. By default, it returns null.
private static class ThreadLocalGenerateSHA1 extends
ThreadLocal<GenerateSHA1> {
@Override
protected GenerateSHA1 initialValue() {
return new GenerateSHA1();
}
}
private static final ThreadLocalGenerateSHA1 generateSHA1 = new ThreadLocalGenerateSHA1();
...
On the tasks, simply call the get()
method of generateSHA1. You do not need to call set()
.
You can take help of beforeExecute and afterExecute methods of the ThreadPoolExecutor by extending it. In your extended class, create 4 MessageDigest objects and assign them to each task in beforeExecute(...) in a round-robin fashion.
private static final Executor executor = new MyThreadPoolExecutor(10, 10, 50000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(100));
I feel the object pool option mentioned by Ravi Bhatt as the simple and elegant idea. Create a pool and let the task ask for the MessageDigest from the pool.