ThreadPool study
线程池浅析
线程池顾名思义就是放线程的池子 Thread Pool。
那么为什么要有线程池呢?有些时候系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新的线程,则系统创建销毁线程的开销就太大了,甚至在创建和销毁线程的时间比任务的执行时间还长。
使用new Thread() 会有如下缺点:
1.创建和销毁线程耗费大量系统资源;
2.每次new Thread() 缺乏线程管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
3.不利于扩展,如定期执行,定时执行,线程中断。
线程池主要解决了两个问题:
1.通过重用线程,达到减少每个线程创建和销毁的性能开销。
2.对线程进行一些维护,比如定时开始,周期执行,并发控制等。
3.可控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争。
Executor:JDK1.5引入,内部使用线程池机制,在java.util.cocurrent包下,Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable,ThreadPoolExecutor等。
Executors:工厂类 创建线程池
1.newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
创建一个固定数目的线程池,内部维持一个无界的队列,当所有的线程都在处于活动状态时提交了其他任务,则新任务将在队列中等待直到线程可用。
2.newCachedThreadPool
public static ExecutorService newCachedThreadPool()
{ return new ThreadPoolExecutor(, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程。
该线程池适用于执行许多短暂异步任务的程序,调用execute会重用以前构造的线程,如果没有可用的线程,则会创建新的线程,并将该线程添加到该池中,未使用60秒的线程将被终止并从缓存中删除。因此,长时间保持闲置的池将不会消耗任何资源。
3.newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
创建一个使用无界队列运行单个工作线程的执行程序,等效于newFixedThreadPool(1)
4.newScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
创建一个线程池,可以调度命令在给定的延迟之后运行,或定期执行。
scheduleAtFixedRate(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
首次执行在 initialDelay 之后,第二次 执行时间为 initialDelay+delay*1 ….
scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
第一次的执行时间为 当前时间+ initialDelay,第二次为第一次执行结束时间+delay
ExecutorService 的submit() 和 execute()区别:
1.入参不同 submit可以接收Runnable或者Callable ,execute方法只能接收Runnable
2.返回值 submit 有返回值 而 execute没有返回值
3.submit方便处理Exception Future.get抛出的异常
Runnable和Callable的区别
Callable接口中的call方法是有返回值的,泛型可任意制定,但是Runnable接口中run方法是没有返回值的。
ThreadPoolExecutor:JDK提供的Executors工具类中创建的线程无法满足使用场景时,则需要手动配置和调优,则用到该池。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
参数详解:
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:最大空闲时间
BlockingQueue:使用的任务队列
ArrayBlockingQueue:底层是数组的定长任务队列,必须制定长度,可设置是 否公平锁。默认先进先出
LinkedBlockingQueue:底层为链表的可定长任务队列,不指定长度则为无界, 可设置公平锁,默认为先进先出
SynchronousQueue:同步的没有缓冲的任务队列,只有当线程将队列中的take走之后,才能新加进来任务
defaultHandler:该参数代表的是拒绝策略,默认为AbortPolicy
可以通过设置改变
/**
* ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常
* ThreadPoolExecutor.CallerRunsPolicy() 使用主线程跑当前任务
* ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务
* ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务
*/
ThreadPool study的更多相关文章
- ThreadPool.QueueUserWorkItem的用法
代码: ThreadPool.SetMaxThreads(, ); ThreadPool.QueueUserWorkItem((obj) => { MessageBox.Show("执 ...
- C# - 多线程 之 Process与Thread与ThreadPool
Process 进程类, // 提供对本地和远程进程的访问,启动/停止本地系统进程 public class Process : Component { public int Id { get; } ...
- C#多线程--线程池(ThreadPool)
先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行, ...
- mysql can't create threads in threadpool
最近,我们在券商端的mysql运行一段时间后,发生mysql can't create threads in threadpool,如下所示: 据官网一个报告显示,目测是一个bug,内存紧张导致,那天 ...
- Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现
声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...
- Improve Your Study Habits
1.Plan your time carefully. Make a list of your weekly tasks.Then make a schedule or chart of your t ...
- C#中Thread与ThreadPool的比较
最近同事在编写一个基于UPD RTP协议的通信软件,在处理接收Listen时,发现了一个问题到底是用Thread还是ThreadPool呢? 我看同事的问题比较有典型性,还是做以整理培训一下吧 Thr ...
- python线程池(threadpool)模块使用笔记
一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...
- Thread and ThreadPool
C#中Thread与ThreadPool的比较 Thread类,一次使用一个线程,来创建和删除线程.这种方式建立和删除线程是很昂贵的(cpu密集型). Threadpool类 对于大多数的情况下是使用 ...
随机推荐
- ionic android返回键
每次点击返回键只会执行一个事件, 在自定义事件中要控制条件不满足时实行原默认动作. 如果只在一个view中监控, 还需要及时注销事件. http://www.jianshu.com/p/b567cc6 ...
- GDAL多光谱与全色图像融合简单使用
目录 简述 C++代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 ...
- Windows两个网卡配置路由规则 同时访问内网和外网
电脑上有两个网卡,一个有线一个无线,有线连局域网,无线连外网,虽然两个网都连着,但还是会出现访问不通的情况. 这就要求我们自己来配置路由规则,让内网的访问走内网的网卡,外网的访问走外网的网卡. 一.查 ...
- 单片机成长之路(51基础篇) - 013 MCS-51单片机控制详解–T2MOD
T2CON:定时器控制寄存器 寄存器地址0C8H,位寻址0C8H-0CFH. 位地址 CF CE CD CC CB CA C9 C8 位符号 TF2 EXF2 RCLK TCLK EXEN2 TR2 ...
- c#异常重试机制
有时候我们碰到程序异常了,想让程序继续重新执行,进行重试,这时候就需要有一个合适的方法来进行操作: 自己写代码控制太麻烦了,也容易出错.这时候当然是站在巨人的肩膀上, https://github.c ...
- MySQL server has gone away 的两个最常见的可能性
[背景] 今天测试同学反馈他们docker中的测试库时不时就就报“MySQL server has gone away”,事态之紧急搞的我都有点怕了(像我这么成熟稳重 的DBA怎么有可能怕呢): 第一 ...
- Win2012R2 AD主域控登录密码忘记
按照普遍的修改cmd.exe 的方法,还需要注意,DC主控制器修改密码需要在后面加上 /domain net user administrator 123 /domain
- 【iCore1S 双核心板_ARM】例程十八:SD_IAP_FPGA实验——更新升级FPGA
实验现象及操作说明: 1.烧写程序成功,绿色ARM·LED灯点亮,三色FPGA·LED灯循环点亮,烧写失败,如果挂载SD卡失败,红灯快闪,如果打开文件失败,蓝灯快闪,读取文件指针移动失败,白灯点亮,升 ...
- 会使用基本的Render函数后,就会想,这怎么用 v-for/v-if/v-model;我写个vue Render函数进阶
https://blog.csdn.net/wngzhem/article/details/54291024
- Android跳转到应用商店的APP详情页面,以及 Google GMS 各个apk的包
转自:http://www.jianshu.com/p/a4a806567368 需求: 从App内部点击按钮或链接,跳转到应用商店的某个APP的详情页面.让用户 下载 或 评论. 实现: /** * ...