JDK7中ThreadFactory和RejectedExecutionHandler源码概述

来源:互联网 发布:vue.js radio默认选中 编辑:程序博客网 时间:2024/06/05 23:42

在Executors提供的实现线程池初始化的工厂方法中,其底层实现都是采用ThreadPoolExecutor()来实现初始化的:
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);


ThreadFactory是java.util.concurrent下的接口,它能够根据需要创建新线程的对象。使用线程工厂就无需再手工编写对new Thread的调用了,从而允许应用程序使用特殊的线程子类、属性等等。此接口最简单的实现就是:

class SimpleThreadFactory implements ThreadFactory {
 public Thread newThread(Runnable r) {
   return new Thread(r);
 }
}
Executors.defaultThreadFactory()方法提供了更有用的简单实现,即在返回线程前将已创建线程的上下文设置为已知的值。ThreadFactory提供了Thread newThread(Runnable r【由新线程实例所执行的可运行线程】)方法来构造一个新Thread,返回构造的线程,如果请求创建线程被拒绝,则返回null。实现也可能初始化属性,名称,守护程序状态,ThreadGroup等等。

RejectedExecutionHandler是java.util.concurrent包下的接口,在ThreadPoolExecutor的内部提供了四种实现类:AbortPolicy,CallerRunsPolicy,DiscardOldestPolicy,DiscardPolicy,它是无法由ThreadPoolExecutor执行的任务的处理程序。RejectedExecutionHandler提供了void rejectedExecution(Runnable r【所请求执行的可运行任务】,ThreadPoolExecutor executor【试图执行此任务的执行程序】)方法来执行对应的处理。当execute不能接受某个任务时,可以由ThreadPoolExecutor调用的方法。因为超出其界限而没有更多可用的线程或队列槽时,或者关闭Executor时就可能发生这种情况。在没有其他替代方法的情况下,该方法可能抛出未经检查的RejectedExecutionException,而该异常将传播到execute的调用者。


实现可参考:https://github.com/chunericli/wise-utils

原创粉丝点击