JDK7中Executors源码概述

来源:互联网 发布:c语言不等于号怎么打 编辑:程序博客网 时间:2024/06/05 09:27
Executors是java.util.concurrent包下的实现类,其定义了Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类的工厂和实用方法。此类支持以下各种方法:
(1)创建并返回设置有常用配置字符串的ExecutorService的方法
(2)创建并返回设置有常用配置字符串的ScheduledExecutorService的方法
(3)创建并返回"包装的"ExecutorService方法,它通过使特定于实现的方法不可访问来禁用重新配置
(4)创建并返回ThreadFactory的方法,它可将新创建的线程设置为已知的状态
(5)创建并返回非闭包形式的Callable的方法,这样可将其用于需要Callable的执行方法中

基本使用方法:
public class ExecutorServiceTest {
 public static void main(String[] args) throws InterruptedException, ExecutionException{
   ExecutorService single = Executors.newSingleThreadExecutor();
   single.execute(new Runnable(){
     @Override
     public void run(){ }

   });


   ExecutorService fixed = Executors.newFixedThreadPool(3);
   Future<?> futureRunnable = fixed.submit(new Runnable(){
     @Override
     public void run(){ }

   });


   ExecutorService cached = Executors.newCachedThreadPool();
   Future<?> futureCallable = cached.submit(new Callable<Object>() {
     @Override
     public Object call() throws Exception{ }
   });
   System.out.println("Callable results:" + futureCallable.get());

   cached.shutdown();


   ScheduledExecutorService fixedRate = Executors.newScheduledThreadPool(1);
   fixedRate.scheduleAtFixedRate(new ScheduledExecutorTask("job_1"), 1, 1, TimeUnit.SECONDS);
   Thread.sleep(1500);

   fixedRate.shutdown();


   ScheduledExecutorService fixedDelay = Executors.newSingleThreadScheduledExecutor();
   fixedDelay.scheduleWithFixedDelay(new ScheduledExecutorTask("job_2"), 5, 5, TimeUnit.SECONDS);
 }
}

方法实现概述:
public static ExecutorService newFixedThreadPool(int nThreads);
创建一个可重用固定线程数的线程池【nThreads<=0会抛出参数异常】,以共享的无界队列方式来运行这些线程。在任意点,在大多数nThreads线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
public static ExecutorService newFixedThreadPool(int nThreads) {
 return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}

public static ExecutorService newSingleThreadExecutor();
创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ExecutorService newSingleThreadExecutor() {
 return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}

public static ExecutorService newCachedThreadPool();
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有60秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用ThreadPoolExecutor构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
public static ExecutorService newCachedThreadPool() {
 return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
参数:corePoolSize-池中所保存的线程数,即使线程是空闲的也包括在内。
抛出:NullPointerException-如果threadFactory为null
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
 return new ScheduledThreadPoolExecutor(corePoolSize);
}

public static ScheduledExecutorService newSingleThreadScheduledExecutor();
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程会代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其它等效的newScheduledThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
 return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}

Executors中还提供了其它方法来实现线程池的初始化,但是其实现都大同小异,例如:newFixedThreadPool(int nThreads,ThreadFactory threadFactory),这里使用自定义的ThreadFactory来创建线程。ScheduledExecutorService通常被用来替代TimerTask。无论是直接使用ThreadPoolExecutor来实现线程池的初始化,还是使用其相关包装代理类,其底层对于线程池的初始化都是采用给定的初始参数来创建新的ThreadPoolExecutor。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
参数:
corePoolSize-池中所保存的线程数,包括空闲线程
maximumPoolSize-池中允许的最大线程数
keepAliveTime-当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
unit-keepAliveTime参数的时间单位
workQueue-执行前用于保持任务的队列,此队列仅保持由execute方法提交的Runnable任务
threadFactory-执行程序创建新线程时使用的工厂
handler-由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序
抛出:
IllegalArgumentException-如果corePoolSize或keepAliveTime小于0,或者maximumPoolSize小于等于0,或者corePoolSize大于 maximumPoolSize。

NullPointerException-如果workQueue,threadFactory或handler为null


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

原创粉丝点击