耘朵
一只不务正业的程序媛
Toggle navigation
耘朵
主页
归档
标签
线程池
java
线程
2021-11-01 10:57:17
148
0
0
admin
java
线程
## 对比Thread和线程池 **new Thread 弊端** 1. 每次 new Thread 新建对象,性能差 2. 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或OOM 3. 缺少更多功能,如更多执行、定期执行、线程中断 **线程池的好处** 1. 重用存在的线程,减少对象创建、消亡的开销,性能佳 2. 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞 3. 提供定时执行,定期执行,单线程,并发数控制等功能 ## 线程池-ThreadPoolExecutor(构造) - corePoolSize:核心线程数量 - maximumPoolSize:线程最大线程数 - workQueue:阻塞队列,存储等待执行的任务,很重要,会对线程池运行过程产生重大影响,超出最大线程数就会进入阻塞队列 - keepAliveTime:线程没有任务执行时最多保持多久时间终止 - unit:keepAliveTime的时间单位 - threadFactory:线程工厂,用来创建线程 - rejectHandler:当拒绝处理任务时的策略,1.默认抛出异常,2.用调用者所在的线程执行任务,3.丢弃队列中最靠前的任务并执行当前任务,4.直接丢弃任务 **流程** |状态||状态||状态||状态| |----|----|----|----|----|----| |RUNNING| ---*shutdown()*--->| SHUTDOWN(不能接受新启动的任务,但是可以处理阻塞队列中的任务)| ---*阻塞队列为空,线程池中的工作线程数为0*--->| TIDYING| ---*terminated()*---> |TERMINATED| || ---*shutdownNow()*--->| STOP(不接受新的任务也不处理队列中的任务)| ---*线程池中的工作数量为0*---> |TIDYING|---*terminated()*---> |TERMINATED| **方法** execute():提交任务,交给线程池执行 submit():提交任务,能够返回执行结果 execute+Future shutdown():关闭线程池,等待任务都执行完 shutdowanNow():关闭线程池,不等待任务执行完 getTaskCount():线程池已执行和未执行的任务总数 getCompletedTastCount():已完成的任务数量 getPoolSize():线程池当前的线程数量 getActiveCount():当前线程池中正在执行任务的线程数量 ### 线程池-Executor框架接口 - Executors.newCachedThreadPool创建可缓存的线程池 - Executors.newFiexedThreadPool创建定长线程池,超出的线程在队列中等待 - Executors.newScheduledThreadPool创建定长线程池,支持定时和周期性任务执行 - Executors.newSingleThreadExecutor创建单线程化线程池,只会用唯一一个公用线程调度,保证所有线程按照指定顺序执行 ### 线程池-合理配置 - CPU密集型任务,就需要尽量压榨CPU,参考值可以设为NCPU+1 - IO密集型任务,参考值可以设置为2*NCPU
上一篇:
多线程并发
下一篇:
JUC中AQS-AbstractQueuedSynchronizer并发中的同步器
0
赞
148 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航