zoukankan      html  css  js  c++  java
  • 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);
    	}



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

  • 相关阅读:
    Go:获取命令行参数
    Go:文件操作
    Go:类型断言
    GO:interface
    Go:面向"对象"
    Go:工厂模式
    layui中流加载layui.flow
    js显示当前时间
    layui中的分页laypage
    layui中的多图上传
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3100767.html
Copyright © 2011-2022 走看看