博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊高并发(四十四)解析java.util.concurrent各个组件(二十) Executors工厂类
阅读量:6686 次
发布时间:2019-06-25

本文共 4154 字,大约阅读时间需要 13 分钟。

Executor框架为了更方便使用,提供了Executors这个工厂类。通过一系列的静态工厂方法。能够高速地创建对应的Executor实例。

仅仅有一个nThreads參数的newFixedThreadPool方法会创建一个ThreadPoolExecutor,corePoolSize和maximumPoolSize都是nThreads。而且keepAliveTime为0表示不会设置过期时间,採用LinkedBlockingQueue作为工作队列

这种方法创建的ThreadPoolExecutor採用固定线程数nThreads,当线程少于nThreads时会为新的任务创建新的Worker工作线程,直到线程数达到nThreads。线程达到nThreads后不会回收。兴许新建的任务会进入工作队列,工作队列是无界的。当任务量过大时。可能会由于无界的工作队列造成OOM的问题。

public static ExecutorService newFixedThreadPool(int nThreads) {        return new ThreadPoolExecutor(nThreads, nThreads,                                      0L, TimeUnit.MILLISECONDS,                                      new LinkedBlockingQueue
()); }

这种方法和上面的方法基本一致。仅仅是多了一个ThreadFactory。能够自己定义创建的线程属性。

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {        return new ThreadPoolExecutor(nThreads, nThreads,                                      0L, TimeUnit.MILLISECONDS,                                      new LinkedBlockingQueue
(), threadFactory); }

这个newSingleThreadExecutor是上面的方法基本一致,仅仅是创建了单线程的线程池

public static ExecutorService newSingleThreadExecutor() {        return new FinalizableDelegatedExecutorService            (new ThreadPoolExecutor(1, 1,                                    0L, TimeUnit.MILLISECONDS,                                    new LinkedBlockingQueue
())); }

这种方法和上面的方法基本一致,仅仅是多了一个ThreadFactory。能够自己定义创建的线程属性。

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {        return new FinalizableDelegatedExecutorService            (new ThreadPoolExecutor(1, 1,                                    0L, TimeUnit.MILLISECONDS,                                    new LinkedBlockingQueue
(), threadFactory)); }

这个newCachedThreadPool返回一个ThreadPoolExecutor,corePoolSize为0。maximumPoolSize为Integer.MAX_VALUE,表示的意思是线程数没有限制。

KeepAliveTime为60秒,表示的意思是当线程空暇时间超过60秒才会回收线程。

这个就是所谓的Cache。空暇的意思之前说了。表示Worker在工作队列中取任务时,假设超过60秒没取到任务,这个线程就超时,要被回收。採用了SynchronousQueue同步队列作为工作队列。意思是来一个新任务就把任务交给Worker工作线程,不入队列。假设没有可用的工作线程,就创建新的工作线程。这种方法的问题是当任务量大时。会消耗太多的CPU资源,创建太多线程。增大线程上线文切换等消耗。

public static ExecutorService newCachedThreadPool() {        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                      60L, TimeUnit.SECONDS,                                      new SynchronousQueue
()); }
这种方法和上面的方法基本一致,仅仅是多了一个ThreadFactory。能够自己定义创建的线程属性。

public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                      60L, TimeUnit.SECONDS,                                      new SynchronousQueue
(), threadFactory); }
这种方法创建单线程的ScheduledThreadPoolExecutor。DelegatedScheduleExecutorService是个包装类。将ScheduledThreadPoolExecutor的对外接口缩小
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {        return new DelegatedScheduledExecutorService            (new ScheduledThreadPoolExecutor(1));    }

这种方法和上面的方法基本一致,仅仅是多了一个ThreadFactory,能够自己定义创建的线程属性。

public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {        return new DelegatedScheduledExecutorService            (new ScheduledThreadPoolExecutor(1, threadFactory));    }

这种方法创建corePoolSize个线程的ScheduledThreadPoolExecutor。其它特性和newFixedThreadPool(nThreads)一致

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {        return new ScheduledThreadPoolExecutor(corePoolSize);    }
这种方法和上面的方法基本一致,仅仅是多了一个ThreadFactory,能够自己定义创建的线程属性。

public static ScheduledExecutorService newScheduledThreadPool(            int corePoolSize, ThreadFactory threadFactory) {        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);    }
这种方法把Runnable接口适配成Callable接口

public static 
Callable
callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter
(task, result); }

转载地址:http://bnhao.baihongyu.com/

你可能感兴趣的文章
javascript go()函数
查看>>
UML类图与类的关系详解
查看>>
C#结构函数
查看>>
springmvc+spring+mybatis+maven项目构建
查看>>
Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持
查看>>
C# params关键字
查看>>
[Angular] Router outlet events
查看>>
OpenCV 玩九宫格数独(二):knn 数字识别
查看>>
hdu 1233 还是畅通project(kruskal求最小生成树)
查看>>
cocos2dx3.0 2048多功能版
查看>>
系统垃圾清理利器CCleaner v5.30.6063绿色单文件版(增强版)
查看>>
自然语言交流系统 phxnet团队 创新实训 个人博客 (六)
查看>>
Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处
查看>>
程序员的多线程的生活
查看>>
leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法
查看>>
免费云盘,为什么不用?
查看>>
java后台json如何传递到jsp中解析
查看>>
Dubbo -- 系统学习 笔记 -- 配置参考手册
查看>>
CentOS 搭建 Mysql MMM 高可用架构
查看>>
Android设计模式(七)--原型模式
查看>>