文档章节

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

汪林
 汪林
发布于 2014/06/14 11:33
字数 631
阅读 398
收藏 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中高级面试必问之多线程TOP50(含答案)

以下为大家整理了今年一线大厂面试被问频率较高的多线程面试题,由于本人的见识局限性,所以可能不是很全面,也欢迎大家在后面留言补充,谢谢。 1、什么是线程? 2、什么是线程安全和线程不安...

老道士
08/28
0
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

没有更多内容

加载失败,请刷新页面

加载更多

可爱的python测试开发库(python测试开发工具库汇总)

欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 相关书籍下载 测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接 selenium - web UI自动化测试。 链...

python测试开发人工智能安全
今天
2
0
Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部