转-- 介绍 Java 自带的线程池(2)

java.util.concurrent.ThreadPoolExecutor 类提供了丰富的可扩展性。你可以通过创建它的子类来自定义它的行为。例如,我希望当每个任务结束之后打印一条消息,但我又无法修改任务对象,那么我可以这样写:

1 ThreadPoolExecutor executor = new ThreadPoolExecutor(size, maxSize, 1, TimeUnit.DAYS, queue) {
2     @Override
3     protected void afterExecute(Runnable r, Throwable t) {
4         System.out.println("Task finished.");
5     }
6 };

除了 afterExecute 方法之外,ThreadPoolExecutor 类还有 beforeExecute()terminated() 方法可以重写,分别是在任务执行之前和整个线程池停止之后执行。

除了可以添加任务执行前后的动作之外, ThreadPoolExecutor 还允许你自定义当添加任务失败后的执行策略。你可以调用线程池的 setRejectedExecutionHandler() 方法,用自定义的 RejectedExecutionHandler 对象替换现有的策略。 ThreadPoolExecutor 提供 4 个现有的策略,分别是:

  ThreadPoolExecutor.AbortPolicy:表示拒绝任务并抛出异常
  ThreadPoolExecutor.DiscardPolicy:表示拒绝任务但不做任何动作
  ThreadPoolExecutor.CallerRunsPolicy:表示拒绝任务,并在调用者的线程中直接执行该任务
  ThreadPoolExecutor.DiscardOldestPolicy:表示先丢弃任务队列中的第一个任务,然后把这个任务加进队列。

这里是一个例子:

1 ThreadPoolExecutor executor = new ThreadPoolExecutor(size, maxSize, 1, TimeUnit.DAYS, queue);
2 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());

除此之外,你也可以通过实现 RejectedExecutionHandler 接口来编写自己的策略。下面是一个例子:

1 ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.SECONDS, queue,
2         new RejectedExecutionHandler() {
3             public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
4                 System.out.println(String.format("Task %d rejected.", r.hashCode()));
5             }
6         }
7  
8 );

 

posted @ 2012-12-20 11:33  柱柱  阅读(166)  评论(0编辑  收藏  举报