Executors工厂类创建线程池的底层实现

上一篇介绍了ThreadPoolExecutor的基本使用,现在再来看看Executors工厂类的基本使用与底层实现方式。

三种创建线程池的工厂方法源码:

// 无界线程池
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
创建了一个核心线程数为0,最大线程数无界,keepAliveTime60秒,使用直接提交策略的SynchronousQueue。
由于使用的是SynchronousQueue,所以不断的接受任务,由于corePoolSize设置为0,
不存在可用于立即运行任务的线程,所以创建新线程执行任务。由于设置的keepAliveTime为60秒。
所以,当某线程服务完A任务后,60秒后被回收,期间还有可能去服务其它的任务。达到线程重用的效果。

// 固定大小线程池
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
创建了一个核心线程数跟最大线程数相同,keepAliveTime为0毫秒,使用无界队列的LinkedBlockingQueue。
这样一个线程池,池内只有固定数量的核心线程,新来的任务全部在队列中等待。

// 单个后台线程
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
创建了一个核心线程数跟最大线程数为1,keepAliveTime为0毫秒,使用无界队列的LinkedBlockingQueue。
跟上面的类似,只不过本线程池有且只有一条线程再为其服务,新来的任务全部在队列中等待。

Executors工厂类为我们提供创建线程池更简便的方式,可以满足一些基本需求,不能满足业务需求的时候,我们还是要通过ThreadPoolExecutor来创建线程池的。

说完了Executors类,顺便说一下ScheduledExecutorService。
此类可安排在给定的延迟后运行或定期执行的命令。一个例子演示完毕,每3秒钟输出一次Hello Thread. 10秒后结束任务,关闭Scheduler
public static void main(String[] args) {
		final ScheduledExecutorService myScheduler = Executors.newScheduledThreadPool(1);
		// 一秒后执行任务,每隔3秒执行一次
		final ScheduledFuture<?> handler = myScheduler.scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				System.out.println("Hello Thread.");
			}
		}, 1, 3, TimeUnit.SECONDS);
		// 10秒后结束任务,并关闭Scheduler
		myScheduler.schedule(new Runnable() {
			@Override
			public void run() {
				handler.cancel(true);
				myScheduler.shutdown();
			}
		}, 10, TimeUnit.SECONDS);
	}

Ps:  scheduleAtFixedRate跟scheduleWithFixedDelay的区别仅仅存在于第三个参数上
scheduleAtFixedRate :任务间隔时间从上一个任务的开始时间算起
scheduleWithFixedDelay :任务间隔时间从上一个任务的结束时间算起,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。


原创文章,转载请注明出处: http://blog.csdn.net/thinking_in_android

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值