没有合适的资源?快使用搜索试试~ 我知道了~
详解Java线程池和Executor原理的分析
0 下载量 117 浏览量
2020-08-29
20:23:12
上传
评论
收藏 93KB PDF 举报
温馨提示
试读
3页
主要介绍了详解Java线程池和Executor原理的分析的相关资料,这里提供实例及分析原理帮助大家理解这部分知识,需要的朋友可以参考下
资源推荐
资源详情
资源评论
详解详解Java线程池和线程池和Executor原理的分析原理的分析
主要介绍了详解Java线程池和Executor原理的分析的相关资料,这里提供实例及分析原理帮助大家理解这部分知
识,需要的朋友可以参考下
详解详解Java线程池和线程池和Executor原理的分析原理的分析
线程池作用与基本知识线程池作用与基本知识
在开始之前,我们先来讨论下“线程池”这个概念。“线程池”,顾名思义就是一个线程缓存。它是一个或者多个线程的集合,用
户可以把需要执行的任务简单地扔给线程池,而不用过多的纠结与执行的细节。那么线程池有哪些作用?或者说与直接用
Thread相比,有什么优势?我简单总结了以下几点:
减小线程创建和销毁带来的消耗减小线程创建和销毁带来的消耗
对于Java Thread的实现,我在前面的一篇blog中进行了分析。Java Thread与内核线程是1:1(Linux)的,再加上Thread在
Java层与C++层都有不少成员数据,所以Java Thread其实是比较重的。创建和销毁一个Java Thread需要OS和JVM都做不少
工作,因此如果将Java Thread缓存起来,可以实现一定的效率提升。
更加方便和透明的实现计算资源控制更加方便和透明的实现计算资源控制
讨论这一条,可能需要举一些例子。以非常闻名的web服务器Nginx为例,Nginx以强大的并发能力和低资源消耗而著称。
Nginx为了实现这些严格的要求,它严格地限定了工作线程的数目(worker线程一般等于CPU数目)。这种设计的着眼点就是
降低线程切换带来的性能损失,这条优化方式对Java同样适用。倘若,每来一个任务就新建一个Thread来运算,那最终的结
果就是程序资源难以控制(某个功能把CPU跑满了),而且整体的执行速度也比较慢。 而Java线程池提供了
FixedThreadPool,你可以使用它实现线程最大数目的控制。
上面说了这么多的“废话”,还是来结合Java线程池的实现来分析一下吧!Java的线程池有一下几种实现:
cached ThreadPool
缓存线程池的特点是它会缓存之前的线程,新提交的任务可以运行在缓存的线程中,即实现了前文所述的第一个优势。
fixed ThreadPool
cachedThreadPool的一个特点是——新提交的任务没有空闲线程可以执行了,就会创建一个新的线程。而fixedThreadPool不
会这样,它会将任务保存起来,等到有空闲线程再执行。即实现了前文所述的第二个优势。
scheduled ThreadPool
scheduled ThreadPool的特点是可以实现任务的调度,比如任务的延迟执行和周期执行。
出了上面三种,Java还实现了newWorkStealingPool,这个是基于Fork/Join框架的。目前我还没研究这个,所以就先不管它
了。Java的并发支持中,使用了Executor来包装各种线程池,“执行器”这个名称其实挺贴切的,线程池可不就是个执行器嘛!
1.cached ThreadPool、、fixed ThreadPool的实现的实现
从前文的描述就可以看出,这两种线程池非常类似。的确是这样,事实上它们是同时实现的,不行我们来看实际例子:
ThreadPoolExecutor executor1 = (ThreadPoolExecutor)Executors.newCachedThreadPool();
ThreadPoolExecutor executor2 = (ThreadPoolExecutor)Executors.newFixedThreadPool(4);
这是两种线程池的新建方法,看起来很像吧!如果你不这么认为,我只能让你看看真相了。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
是的,它们调用了同一个构造函数,只是参数略有不同。那么我们来看看这些参数的含义,以及两组参数的区别。首先还是需
要贴一下ThreadPoolExecutor的构造函数了。
public ThreadPoolExecutor(int corePoolSize,
资源评论
weixin_38665822
- 粉丝: 9
- 资源: 933
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功