文档章节

Java Executor分析

AaronSheng
 AaronSheng
发布于 2016/10/14 16:58
字数 755
阅读 33
收藏 0

Executor框架可以快速创建Java线程池。
Executors是Executor框架的基础。所有的Executor和ExecutorService都实现Executor接口,其中ExecutorService是比较重要的接口,Executors提供了很多静态方法可以实现很多ThreadPool。通过ExecutorService的submit可以分别将Callable和Runnable任务提交到线程中处理;通过shutdown()关闭所有线程,Callable返回的Future有结果,Runnable则没有。

Executors类:

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

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

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

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

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue());
    }

    public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(), threadFactory);
    }

    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new Executors.DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
    }

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

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }
}


主要方法:
1. newFixedThreadPool返回ThreadPoolExecutor,ThreadPoolExecutor创建固定数目的线程,当有任务submit时,如果没有线程可执行时,则加入任务队列。ThreadPoolExecutor刚开始不创建线程,当有任务提交时,如果poolSize<corePoolSize则创建线程,当poolSize==corePoolSize时,新增任务加入任务队列,如果此时任务队列满了并且poolSize<maximumPoolSize,则创建线程处理,否则就拒绝任务,拒绝策略取决于RejectedExecutionHandler,Worker线程则一直在等待队列getTask和run间循环;

2. newCachedThreadPool返回的也是ThreadPoolExecutor,区别是cache线程数大小没有限制,有60秒的IDLE,如果超过60秒没有任务则会被关闭;

3. newSingleThreadExecutor返回Executors.FinalizableDelegatedExecutorService,底层也是ThreadPoolExecutor,区别是线程是1~1,IDLE为0秒;

4. newScheduledThreadPool返回ScheduledExecutorService,ScheduledExecutorService继承ThreadPoolExecutor并实现了ScheduledExecutorService,ScheduledExecutorService封装一个DelayedWorkQueue,Worker执行一次任务后add进去,另一个Worker触发take,take需要等待一个delay,重复循环下去。

5. newWorkStealingPool返回ForkJoinPool,ForkJoinPool分而治之,ForkJoinPool默认创建CPU数目创建并行等级,会动态的增加或关闭线程,最大线程数限制为32767,空闲线程会主动为别的线程分担任务,从而使CPU处于饱满状态,我们要使用ForkJoin框架,必须首先创建一个ForkJoinTask。它提供在任务中执行fork( )和join( )操作的机制,通常情况下我们不需要直接继承ForkJoinTask类,而只需要继承它的子类,Fork/Join框架提供了以下两个子类:RecursiveAction用于没有返回结果的任务,RecursiveTask 用于有返回结果的任务。ForkJoinTask需要通过ForkJoinPool来执行,任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务。

© 著作权归作者所有

上一篇: Volatile原理分析
下一篇: Ubuntu创建pptp代理
AaronSheng
粉丝 14
博文 52
码字总数 51122
作品 0
深圳
程序员
私信 提问
MyBatis一级缓存原理解析

MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能...

编程SHA
03/28
0
0
Java8的CompletableFuture详解

Java5中,Future以及相关使用方法提供了异步执行任务的能力,但对于结果的获取却不是很方便,只能通过get()方法阻塞住调用线程直至计算完成返回结果或者isDone()方法轮询的方式得到任务结果,...

hensemlee
01/29
0
0
Mybatis源码解析-Mapper执行SQL过程

测试准备 添加mybatis-config.xml全局配置文件 jdbc.properties 添加实体类 添加mapper接口 添加mapper映射文件 添加测试方法 执行过程分析 SqlSession创建 SqlSession创建通过调用DefaultSq...

寒武没有纪
2018/07/28
0
0
mybatis实践--MyBatis拦截器原理探究和实例

转自:MyBatis拦截器原理探究(https://www.cnblogs.com/fangjian0423/p/mybatis-interceptor.html) MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器...

spinachgit
02/02
0
0
spark 使用中会遇到的一些问题及解决思路

7 内存溢出问题 在Spark中使用hql方法执行hive语句时,由于其在查询过程中调用的是Hive的获取元数据信息、SQL解析,并且使用Cglib等进行序列化反序列化,中间可能产生较多的class文件,导致J...

hblt-j
2017/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第104篇原创 文章工程: * JDK 1.8 * Maven 3.5.2 * Spring Boot 2.1....

泥瓦匠BYSocket
45分钟前
3
0
$_ENV

$_ENV数组中的内容是在PHP解析器运行时,从PHP所在服务器中的环境变量, 导入到PHP的全局命名空间, 转变为PHP全局变量。 这些变量很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能...

vinci321
今天
2
0
Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

铁骨铮铮
今天
3
0
JAVA NIO Connection reset by peer 异常

客户端主动断开与服务端的连接,但是如果客户端掉线,服务端就接收不到了。。 异常信息 java.io.IOException: Connection reset by peerat java.base/sun.nio.ch.FileDispatcherImpl.read...

Jeremy_pan
今天
2
0
龙芯版办公软件下载

金山wps office   rpm包:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm   deb包:http://packages.deepin.com/loongson/pool/......

gugudu
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部