ThreadPoolExecutor 线程池
2024-08-24 10:42:10
TestThreadPoolExecutorMain
package core.test.threadpool; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* ThreadPoolExecutor 线程池
* 构造函数参数
*
* 1、corePoolSize 核心线程数大小,当线程数 < corePoolSize ,会创建线程执行 runnable
*
* 2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把 runnable 放入 workQueue中
*
* 3、keepAliveTime 保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
*
* 4、unit 时间单位
*
* 5、workQueue 保存任务的阻塞队列
*
* 6、threadFactory 创建线程的工厂
*
* 7、handler 拒绝策略
*
* 任务执行顺序 (核心线程数,阻塞队列,最大线程数,异常)
*
* 1、当线程数小于 corePoolSize时,创建线程执行任务。
*
* 2、当线程数大于等于 corePoolSize并且 workQueue 没有满时,放入workQueue中
*
* 3、线程数大于等于 corePoolSize并且当 workQueue 满时,新任务新建线程运行,线程总数要小于 maximumPoolSize
*
* 4、当线程总数等于 maximumPoolSize 并且 workQueue 满了的时候执行 handler 的
* rejectedExecution。也就是拒绝策略。
*
* 四个拒绝策略
*
* ThreadPoolExecutor默认有四个拒绝策略:
*
* 1、ThreadPoolExecutor.AbortPolicy() 直接抛出异常RejectedExecutionException
*
* 2、ThreadPoolExecutor.CallerRunsPolicy() 直接调用run方法并且阻塞执行
*
* 3、ThreadPoolExecutor.DiscardPolicy() 直接丢弃后来的任务
*
* 4、ThreadPoolExecutor.DiscardOldestPolicy() 丢弃在队列中队首的任务
*
* 当然可以自己继承RejectedExecutionHandler来写拒绝策略.
*
* @author chenyd 2017年10月24日
*/
public class TestThreadPoolExecutor {
public static void main(String[] args) {
Long currentTimeMillis = System.currentTimeMillis();
// new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
// unit, workQueue)
ThreadPoolExecutor threadpool = new ThreadPoolExecutor(3, 10, 3, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3)); for (int i = 0; i < 100; i++) { try {
String task = "task=" + i;
System.out.println("创建任务并提交到线程池:" + task);
threadpool.execute(new ThreadPoolTast(task)); Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
} } try {
threadpool.shutdown();
boolean loop = true; do {
loop = !threadpool.awaitTermination(2, TimeUnit.SECONDS);
} while (loop); if (loop != true) {
System.out.println("所有线程执行完毕");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("耗时:" + (System.currentTimeMillis() - currentTimeMillis));
} }
}
ThreadPoolTast
package core.test.threadpool; import java.io.Serializable; public class ThreadPoolTast implements Runnable, Serializable { /**
*
*/
private static final long serialVersionUID = 1L; private Object attachData; public ThreadPoolTast(Object tasks) {
this.attachData=tasks;
} @Override
public void run() { try {
System.out.println("开始执行任务:"+attachData+"任务,使用线程池,线程名称:"+Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
} attachData=null; }
}
参考链接:
Java四种线程池的使用 http://cuisuqiang.iteye.com/blog/2019372
最新文章
- 第 1 章 jQuery EasyUI 入门
- 项目:学生查看自己的作业情况和分数(php)
- [原]ComFriendlyWaitMtaThreadProc
- DOM操作基础
- Android组件系列----ContentProvider内容提供者
- Writable、WritableComparable和comparators
- win7防火墙打不开(无法启动windows firewall服务)
- java中的异常结构
- 异步化DAO的设计和实践
- OpenCV学习 5:关于平滑滤波器 cvSmooth()函数
- javascript操作HTML元素
- Qt学习之路(49): 通用算法
- 配置Meld为git的默认比较工具
- Variant does not reference an auomation object
- (转载)python调用shell命令之os 、commands、subprocess
- Dockerfile指令详解
- php 求余
- github提交代码后没有contribution问题
- python 递增递减数列
- LOJ#162. 快速幂 2(分块)
热门文章
- adb 连接时候不弹出授权对话框【转】
- Jackson 对象与json数据互转工具类JacksonUtil
- 启动tomcat时,经常遇到的问题 8080 端口被占用
- LA-4356&;&;hdu-2469 (极角排序+扫描线)
- (转)Vim自动补全神器:YouCompleteMe
- 【扬中集训Day6T1】 白日梦
- CClientDC类 CWindowDC类
- cocos2d-x 坐标系解惑
- Collection View Programming Guide for iOS---(四)---Using the Flow Layout
- Codeforces510B【dfs】