类工厂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

文章结束给大家分享下程序员的一些笑话语录: 人工智能今天的发展水平:8乘8的国际象棋盘其实是一个体现思维与创意的强大媒介。象棋里蕴含了天文数字般的变化。卡斯帕罗夫指出,国际象棋的合法棋步共有1040。在棋局里每算度八步棋,里面蕴含的变化就已经超过银河系里的繁星总数。而地球上很少有任何数量达到这个级别。在金融危机之前,全世界的财富总和大约是1014人民币,而地球人口只有1010。棋盘上,所有可能的棋局总数达到10120,这超过了宇宙里所有原子的总数!经典语录网

--------------------------------- 原创文章 By
类和工厂
---------------------------------

原文地址:https://www.cnblogs.com/jiangu66/p/3102213.html