线程池:ThreadPoolExecutor的使用
ThreadPoolExecutor配置
一、ThreadPoolExcutor为一些Executor提供了基本的实现,这些Executor是由Executors中的工厂 newCahceThreadPool、newFixedThreadPool和newScheduledThreadExecutor返回的。 ThreadPoolExecutor是一个灵活的健壮的池实现,允许各种各样的用户定制。
二、线程的创建与销毁
1、核心池大小、最大池大小和存活时间共同管理着线程的创建与销毁。
2、核心池的大小是目标的大小;线程池的实现试图维护池的大小;即使没有任务执行,池的大小也等于核心池的大小,并直到工作队列充满前,池都不会创建更多的线程。如果当前池的大小超过了核心池的大小,线程池就会终止它。
3、最大池的大小是可同时活动的线程数的上限。
4、如果一个线程已经闲置的时间超过了存活时间,它将成为一个被回收的候选者。
5、newFixedThreadPool工厂为请求的池设置了核心池的大小和最大池的大小,而且池永远不会超时
6、newCacheThreadPool工厂将最大池的大小设置为Integer.MAX_VALUE,核心池的大小设置为0,超时设置为一分钟。这样创建了无限扩大的线程池,会在需求量减少的情况下减少线程数量。
三、管理
1、 ThreadPoolExecutor允许你提供一个BlockingQueue来持有等待执行的任务。任务排队有3种基本方法:无限队列、有限队列和同步移交。
2、 newFixedThreadPool和newSingleThreadExectuor默认使用的是一个无限的 LinkedBlockingQueue。如果所有的工作者线程都处于忙碌状态,任务会在队列中等候。如果任务持续快速到达,超过了它们被执行的速度,队列也会无限制地增加。稳妥的策略是使用有限队列,比如ArrayBlockingQueue或有限的LinkedBlockingQueue以及 PriorityBlockingQueue。
3、对于庞大或无限的池,可以使用SynchronousQueue,完全绕开队列,直接将任务由生产者交给工作者线程
4、可以使用PriorityBlockingQueue通过优先级安排任务
ok
废话不多少说,直接开始:
public class ThreadFactory {
static class ThreadPoolTask implements Runnable, Serializable {
private Object attachData;
ThreadPoolTask(Object o){
this.attachData = o;
}
@Override
public void run() {
System.out.println("开始任务:"+attachData);
}
}
public static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(
10,
30,
2000,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(100));
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i <10 ; i++) {
String s = "task@"+i;
System.out.println("创建任务并提交到线程池中:" + s);
EXECUTOR.execute(new ThreadPoolTask(s));
Thread.sleep(1000);
}
}
}

实例:
1:线程工厂
public class ThreadFactory {
public static ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(
10,
30,
2000,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(100));
}
2:创建任务
public class ThreadPoolTask implements Runnable, Serializable {
private Object o ;
private BaseContext baseContext;
public ThreadPoolTask(BaseEntity baseEntity,BaseContext baseContext){
this.o=baseEntity;
this.baseContext = baseContext;
}
@Override
public void run() {
System.out.println("线程开始:"+o.toString());
baseContext.add((BaseEntity) o);
}
}
3:模拟数据库实体
@Component
public class BaseContext {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseContext.class); public List<BaseEntity> baseEntities = Collections.synchronizedList(new ArrayList<BaseEntity>()); public boolean add(BaseEntity baseEntity){
LOGGER.info("===============新增===============");
return baseEntities.add(baseEntity);
} public BaseEntity query(String name){
for (BaseEntity baseEntity : baseEntities) {
if (baseEntity.getName().equals(name)){
LOGGER.info("查询到的实体:"+baseEntity.toString());
return baseEntity;
}
break;
}
return null;
}
public List<BaseEntity> queryList(){
return baseEntities;
}
}
4:实体
public class BaseEntity {
private String name;
private String age;
public BaseEntity() {
}
public BaseEntity(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "BaseEntity{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
5:测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {XXXXX.class})
public class DemoApplicationTests { @Autowired
private BaseContext baseContext;
@Test
public void contextLoads() { for (int i = 0; i <10 ; i++) {
ThreadFactory.EXECUTOR.execute(new ThreadPoolTask(new BaseEntity(" "+i,"2"),baseContext));
}
baseContext.baseEntities.forEach(s->{
System.out.println(s.toString());
});
} }
6:输出

线程池:ThreadPoolExecutor的使用的更多相关文章
- java线程池ThreadPoolExecutor使用简介
一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...
- 线程池ThreadPoolExecutor
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maxi ...
- 关于线程池ThreadPoolExecutor使用总结
本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一.简介 线程池类为 java.util.concurrent.Thread ...
- [转] 引用 Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
PS: Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool 引用 [轰隆隆] 的 Java自带的线程池Thre ...
- android线程池ThreadPoolExecutor的理解
android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...
- 线程池ThreadPoolExecutor使用简介
一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...
- 线程池ThreadPoolExecutor使用简介(转)
一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...
- java线程API学习 线程池ThreadPoolExecutor(转)
线程池ThreadPoolExecutor继承自ExecutorService.是jdk1.5加入的新特性,将提交执行的任务在内部线程池中的可用线程中执行. 构造函数 ThreadPoolExecut ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- java面试总躲不过的并发(一): 线程池ThreadPoolExecutor基础梳理
本文核心:线程池ThreadPoolExecutor基础梳理 一.实现多线程的方式 1.继承Thread类,重写其run方法 2.实现Runnable接口,实现run方法 3.实现Callable接口 ...
随机推荐
- 评分模型的检验方法和标准通常有:K-S指标、交换曲线、AR值、Gini数等。例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成功的应用价值。K-S值越大,表示评分模型能够将“好客户”、“坏客户”区分开来的程度越大。
评分模型的检验方法和标准通常有:K-S指标.交换曲线.AR值.Gini数等.例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成 ...
- 深入理解 Embedding层的本质
继上文https://blog.csdn.net/weixin_42078618/article/details/82999906探讨了embedding层的降维效果,时隔一个月,分享一下嵌入层在NP ...
- H3C Basic NAT配置示例
- H3C 配置基本ACL
- [转]Win10下安装Linux子系统
工作以来一直DotNet系偏C/S, 接触Web开发的时间也不长, 现在主要偏向Web全栈方向, 一直对Linux系统心生向往, 夜深了娃睡了, 打开老旧的笔记本来折腾一下. 准备工作 控制面板 &g ...
- element-ui—dialog使用过程中的坑
场景一:我们将dialog写成一个可复用的公共组件用于显示不同内容(如表格操作中的修改或添加的弹窗),之后发现dialog的遮罩将弹出层(点击修改或添加后理应由一个弹窗显示出来)都盖住了,而我想要的效 ...
- 浅谈LOG日志的写法
文章来源于公司的大牛 1 Log的用途 不管是使用何种编程语言,日志输出几乎无处不再.总结起来,日志大致有以下几种用途: l 问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在安装配置时,通 ...
- 2019-8-31-C#-await-高级用法
title author date CreateTime categories C# await 高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17 ...
- CSS3侧栏滑出简单实现
使用css3 的 animation 属性实现的点击滑出侧栏 <!DOCTYPE html> <html lang="en"> <head> & ...
- 【u035】奶牛的电信
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方 ...