文档章节

java 并发包里Eexcutors创建线程池的几种方法

汪林
 汪林
发布于 2014/06/14 11:33
字数 631
阅读 395
收藏 0

Executors

    Executors提供了一些方便创建TreadPoolExecutors的方法,主要有以下几个:

newFixedThreadPool(int)

    创建一个固定大小线程池从下面的代码我们可以看出,corePoolSize需要指定,即即使空闲没有任务执行也一直启动的线程,newFixedThreadPool把ThreadPoolExecutor中的keepAliveTime设置为0,即ThreadPoolExecutor中启动的线程数量启动后就一直运行,并不会由于在keepAliveTime的时间内仍没有任务执行而退出。缓冲任务的队列使用的是LinkedBlockingQueue,如果放入线程池中的任务数量(最大为整数的最大值)比线程池中的线程多时,则会把多余的任务放到队列里。

 public static ExecutorService newFixedThreadPool(int nThreads) {

        return new ThreadPoolExecutor(nThreads, nThreads,

                                      0L, TimeUnit.MILLISECONDS,

                                      new LinkedBlockingQueue<Runnable>());

    }

 

newSingleThreadExecutor()

    相当于创建了只有一个线程的固定大小线程池,使用此线程池的时候,并行执行的任务只有一个,其他的任务都放到LinkedBlockingQueue队列中

public static ExecutorService newSingleThreadExecutor() {

        return new FinalizableDelegatedExecutorService

            (new ThreadPoolExecutor(1, 1,

                                    0L, TimeUnit.MILLISECONDS,

                                    new LinkedBlockingQueue<Runnable>()));

    }

newCachedThreadPool()

    创建一个带缓存的线程池,从下面代码可以看出,newCachedThreadPool把ThreadPoolExecutor中的corePoolSize设置为0,即不允许有空闲的线程,最大线程数量为整数的最大值,线程的keepAliveTime为60秒,即如果60秒这个线程还没有任务执行,则退出。缓存任务的队列为SynchronousQueue,在使用时,放入newCachedThreadPool的任务都会复用线程或者启动新线程来执行,随着放入的任务的数量的增加,newCachedThreadPool中新启动的线程数量也随之增加,直到整数的最大值,则抛出异常。

public static ExecutorService newCachedThreadPool() {

        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

                                      60L, TimeUnit.SECONDS,

                                      new SynchronousQueue<Runnable>());

    }

newScheduledThreadPool(int)

    创建一个定时线程池,其中corePoolSize(即使空闲也不会退出的线程数量)需要指定,最大线程数量为整数的最大值,线程的keepAliveTime为0,即不设置线程的空闲时间,缓存任务的队列为DelayedWorkQueue,即任务数量超过线程池中的线程数量,则把任务放到DelayedWorkQueue队列里缓存。在实际业务中,通常会有一些需要定时或者延迟执行的任务,此时,newScheduledThreadPool是个不错的选择。当然在jdk5前可以用Timer来实现,但是Timer只能单线程。

 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
 public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
              new DelayedWorkQueue());
    }

 

© 著作权归作者所有

共有 人打赏支持
汪林
粉丝 7
博文 19
码字总数 8847
作品 0
海淀
程序员
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
java基础thread——java5之后的多线程(浅尝辄止)

承上启下 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象L...

潇潇漓燃
06/03
0
0
JAVA多线程和并发基础面试问答

原文链接 译文连接 作者:Pankaj 译者:郑旭东 校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢...

雷神雨石
2014/07/19
0
2
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
0
0
Java线程框架_Executor

Executor 框架是 juc 里提供的线程池的实现。前两天看了下 Executor 框架的一些源码,做个简单的总结。 线程池大概的思路是维护一个的线程池用于执行提交的任务。我理解池的技术的主要意义有...

天呀鲁哇
2015/02/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day58-20180816-流利阅读笔记-待学习

苹果市值破万亿,iPhone 会涨价吗? Lala 2018-08-16 1.今日导读 苹果教父乔布斯曾经说过:“活着就是为了改变世界。”虽然他在 56 岁时就遗憾离世,但他极具创新和变革的精神早已深埋进苹果...

aibinxiao
20分钟前
4
0
[雪峰磁针石博客]python3快速入门教程1 turtle绘图-2函数

菲波那契序列: >>> # Fibonacci series:... # the sum of two elements defines the next... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...112......

python测试开发人工智能安全
今天
0
0
java环境变量配置最正确的方式

原贴:https://blog.csdn.net/qq_40007997/article/details/79784711,十分详细,亲测有效

kitty1116
今天
0
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
2
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部