读书人

ThreadPoolExecutor的afterExecution方

发布时间: 2012-09-01 09:33:03 作者: rapoo

ThreadPoolExecutor的afterExecution方法之我见
对于ThreadPoolExecutor的
protected void afterExecute(Runnable r, Throwable t)
方法从字面上以及doc上看有点模糊(也许是偶的E文很烂),所以想动手写写,代码如下:

import java.util.ArrayList;import java.util.List;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Callable;import java.util.concurrent.Future;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class TestThreadPool {/** * @param args */public static void main(String[] args) {ThreadPoolExecutor2 pool = new ThreadPoolExecutor2(5, 5,                0L, TimeUnit.MILLISECONDS,                new LinkedBlockingQueue<Runnable>());List<Callable<Integer>> list = new ArrayList<Callable<Integer>>();        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        list.add(new Runner());        List<Future<Integer>> taskList = null;        try {taskList = pool.invokeAll(list);} catch (InterruptedException e) {e.printStackTrace();} finally {if(taskList != null) {for(Future<Integer> future: taskList) {System.out.println(future.cancel(true));}}pool.shutdown();}        }private static class Runner implements Callable<Integer> {@Overridepublic Integer call() throws Exception {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}return 0;}}private static class ThreadPoolExecutor2 extends ThreadPoolExecutor {public ThreadPoolExecutor2(int corePoolSize, int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue) {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);}@Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);System.out.println(Thread.currentThread().getName());System.out.println(this.getActiveCount());}}}

-------------------------------------------
就是override了afterExecute方法。
执行的结果为(每次执行可能会不一样的顺序):
pool-1-thread-3
pool-1-thread-2
5
5
pool-1-thread-1
5
pool-1-thread-4
5
pool-1-thread-5
5
pool-1-thread-3
pool-1-thread-4
4
false
false
false
pool-1-thread-2
false
pool-1-thread-1
4
3
false
3
false
false
false
false
------------------------------------------------
从结果可以看出,afterExecute方法是在ThreadPoolExecutor对象中的任务线程每执行完毕一个我们提交的任务后才调用的一次afterExecute方法。
---------------------------------------------------
网上有贴子说,可以在afterExecute方法中调用getActiveCount()方法返回是否为0来判断我们所提交的任务是否已经执行完毕。
帖子出处:http://group.gimoo.net/review/87384
其实,从上面代码的运行结果来看,getActiveCount()方法直到所有任务执行完毕也没有返回0,所以这种用这种方法来判断是否已经执行完所有的任务是不妥当的。那如何判断呢?其实代码里已经给出了答案!

读书人网 >编程

热点推荐