java修改线程池名称_自定义线程池的名称(ThreadPoolExecutor)
目的:有时候为了快速定位出现错误的位置,在采用线程池时我们需要自定义线程池的名称。
1、创建ThreadFactory(ThreadPoolExecutor默认采用的是DefaultThreadFactory,可以参照代码)。
public class NamedThreadFactory implementsThreadFactory{private final AtomicInteger poolNumber = new AtomicInteger(1);private finalThreadGroup threadGroup;private final AtomicInteger threadNumber = new AtomicInteger(1);public finalString namePrefix;
NamedThreadFactory(String name){
SecurityManager s=System.getSecurityManager();
threadGroup= (s != null) ?s.getThreadGroup() :
Thread.currentThread().getThreadGroup();if (null==name || "".equals(name.trim())){
name= "pool";
}
namePrefix= name +"-"+poolNumber.getAndIncrement()+
"-thread-";
}
@OverridepublicThread newThread(Runnable r) {
Thread t= newThread(threadGroup, r,
namePrefix+threadNumber.getAndIncrement(),0);if(t.isDaemon())
t.setDaemon(false);if (t.getPriority() !=Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);returnt;
}
}
2、创建线程池
//核心线程满了,则进入队列,队列满了,则创建新线程,当线程数达到最大线程数,则进入拒绝策略
static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,1,
TimeUnit.MINUTES,new LinkedBlockingDeque<>(),new NamedThreadFactory("测试"));
3、测试代码
static ThreadLocalthreadLocal = new ThreadLocal(){
@OverrideprotectedSimpleDateFormat initialValue() {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};public static voidmain(String[] args) {
threadPoolExecutor.execute(newRunnable() {
@Overridepublic voidrun() {try{
System.out.println(threadLocal.get().parse("2019-10-22 16:59:00"));throw new NullPointerException("sfa");
}catch(ParseException e) {
e.printStackTrace();
}
}
});
}
4、结果
补充:
1、参数解析
2、拒绝策略
(1)、CallerRunsPolicy
该任务被线程池拒绝,由调用execute方法的线程(如main线程)执行该任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大。
(2)、AbortPolicy
丢弃任务,并抛出 RejectedExecutionException 异常。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
(3)、DiscardOldestPolicy
丢弃任务,不过也不抛出异常。
(4)、DiscardOldestPolicy
当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入。
java修改线程池名称_自定义线程池的名称(ThreadPoolExecutor)相关推荐
- java自定义线程池池,线程池使用及自定义线程池
一 案例引申 编写代码同时只允许五个线程并发访问(以下文的函数为例子) private static void method() { System.out.println("ThreadNa ...
- 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )
文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...
- java 修改最大nio连接数_携程基于Quasar协程的NIO实践
IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题.目前Java项目对接NIO的方式主要依靠回调,代码复杂度高,降低了代码可读性与可 ...
- python线程异常中断_中断线程
如果线程需要执行一个长时间任务,就可能需要能中断线程.中断线程就是其他线程给该线程发一个信号,该线程收到信号后结束执行run()方法,使得自身线程能立刻结束运行. 我们举个栗子:假设从网络下载一个10 ...
- java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法
java 修改 枚举类字段 在本新闻通讯中,该新闻通讯最初发表在Java专家的新闻通讯第161期中,我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例. 显然,这仅适用 ...
- python两个线程交替打印_三线程按顺序交替打印ABC的四种方法
建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 二.Synchroni ...
- 平流式隔油池计算_广州隔油池清理公司讲述清理隔油池程序和标准_新闻中心...
广州隔油池清理公司讲述清理隔油池程序和标准_隔油池清理,清理隔油池,隔油池清理方案,隔油池清理公司,隔油池清理价格 1.?隔油池/内污水油每月定期清理一次,若检查发现污水油超标以致可能影响隔油池有效性 ...
- java 等待线程池结束_等待线程池中任务执行完毕做优雅关闭
背景 在Java开发中,如果涉及多线程,会经常使用到线程池,本期不额外讲述线程池本身相关的东西.考虑一种场景,如果我们提交给线程池的任务都相对比较耗时,而在任务启动运行后,如果后续有需求的变更,要重新 ...
- 线程池原理与自定义线程池
最新文章
- 有三AI正式跨入2.0,诚邀参与内容创作以及广告须知
- Angular应用只执行指定单元测试的小技巧
- Struts2学习---基本配置,action,动态方法调用,action接收参数
- int 取值范围_一定范围内的随机数
- DNS资源记录类型的总结
- [VC]基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)
- 极速安装JumpServer - 官方文档版
- win7安装SQL2005图文教程
- 900款工作岗位竞聘PPT模板免费下载
- win7计算机怎么优化驱动器,win7电脑怎么优化
- 「AutoML」AutoML专栏上线,跟Google一起见证调参党的末日?
- 单片机应用系统设计技术——智能温控器
- Sorry, you have been blocked !vultr 又被 openai 屏蔽了,只能换个 vps 了
- ThinkPad E460如何进入bios
- 【分布式】分布式系统概述
- 桌面计算机回收站打不开,b8,教您电脑回收站打不开怎么解决
- python中pytest教程_Pytest安装新手详细教程
- php xmp,在jpeg中编写XMP元数据(使用PHP) – 使用单个或多个rdf:描述块
- 信号与系统(二):拉普拉斯变换的意义:谈H(s)、h(t)、δ(t)
- Tomcat启动报A child container failed during start问题解决