目的:有时候为了快速定位出现错误的位置,在采用线程池时我们需要自定义线程池的名称。

1、创建ThreadFactory(ThreadPoolExecutor默认采用的是DefaultThreadFactory,可以参照代码)。

public class NamedThreadFactory implements ThreadFactory{

        private final AtomicInteger poolNumber = new AtomicInteger(1);

        private final ThreadGroup threadGroup;

        private final AtomicInteger threadNumber = new AtomicInteger(1);

        public  final String 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-";
} @Override
public Thread newThread(Runnable r) {
Thread t = new Thread(threadGroup, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}

2、创建线程池

 
//核心线程满了,则进入队列,队列满了,则创建新线程,当线程数达到最大线程数,则进入拒绝策略
static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,1,
TimeUnit.MINUTES,new LinkedBlockingDeque<>(),new NamedThreadFactory("测试"));

3、测试代码

 static ThreadLocal<SimpleDateFormat>threadLocal = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}; public static void main(String[] args) {
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
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 中最老的一个任务,并将新任务加入。

最新文章

  1. SQL Server读写分离实现方案简介
  2. CentOS 7.1编译安装PHP7
  3. job
  4. Skyfree退休公告
  5. 《SSM框架搭建》三.整合spring web
  6. Objective-C 中类属性(修饰)
  7. adb logcat 命令
  8. Android IOS WebRTC 音视频开发总结(三八)-- tx help
  9. C# 笛卡尔积
  10. SQL Server 索引和视图【转】
  11. WPF Delegate委托整理
  12. 利用wamp配置虚拟主机
  13. AX_ClassTemplate
  14. 2017-12-15python全栈9期第二天第四节之格式化输出%s和用户交互个人简历模板
  15. keras中的重要函数
  16. Java 8新特性探究(二)深入解析默认方法
  17. MongoDB的下载、安装与部署方法
  18. [label][webSites]一个结合Google地图的图片浏览网站
  19. Android 内存管理研究
  20. iOS: 沙盒的详解和目录的获取

热门文章

  1. [CSP-S模拟测试]:array(单调栈)
  2. Hyperledger交易流程
  3. 大牛整理最全Python零基础入门学习资料
  4. @TableLogic表逻辑处理注解(逻辑删除)
  5. MDX入门(2)
  6. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_7_字符串的转换相关方法
  7. spring boot添加logging不能启动且不报错
  8. django框架ORM数据库
  9. VMWARE 克隆步骤
  10. 编译的时候出现&quot;/usr/bin/ld: cannot find -lz