ThreadPoolExecutor 可扩展性

来源:互联网 发布:丹麦安徒生博物馆知乎 编辑:程序博客网 时间:2024/05/16 05:53

 

到这里对于这个线程池还只是介绍了一小部分。ThreadPoolExecutor 具有很强的可扩展性,不过扩展它的前提是要熟悉它的工作方式。后面的文章将会介绍如何扩展 ThreadPoolExecutor 类。 

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

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

 

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

  ThreadPoolExecutor.AbortPolicy:表示拒绝任务并抛出异常 

  ThreadPoolExecutor.DiscardPolicy:表示拒绝任务但不做任何动作 

  ThreadPoolExecutor.CallerRunsPolicy:表示拒绝任务,并在调用者的线程中直接执行该任务 

  ThreadPoolExecutor.DiscardOldestPolicy:表示先丢弃任务队列中的第一个任务,然后把这个任务加进队列。 

  这里是一个例子: 

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

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); 

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

ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.SECONDS, queue, 

new RejectedExecutionHandler() { 

public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { 

System.out.println(String.format("Task %d rejected.", r.hashCode())); 

 

原创粉丝点击