ThreadFactory使用的必要性

  • 1.阿里编码规约扫描插件的友善提醒
  • 2.ThreadFactory的使用
1.阿里编码规约扫描插件的友善提醒


当我们构建一个线程池时,如果使用了阿里的编码规范扫描插件的话,会提醒我们要使用带ThreadFactory参数的ThreadPoolExecutor构造方法,Ctrl+F1进去我们会看到:
之前的文章已经介绍了线程池中ThreadFactory用于设置创建线程工厂,通过线程工厂给每个创建出来的线程设置更有意义的名字,这样就如插件提示的那样 出错时方便问题的回溯 ,所有当我们在创建线程池的时候使用带有ThreadFactory参数的构造方法是非常有必要的。

2.ThreadFactory的使用

关于ThreadFactory我们可以guava提供的ThreadFactoryBuilder,也可以自定义。这里两种方式各举一个例子:

 package cc.mynatapp.detroitdentist.current;import com.google.common.util.concurrent.ThreadFactoryBuilder;import java.util.concurrent.*;/**
* @author Xu hao
* @Description ThreadFactory的使用
* @Version 1.0
* Email 15229357319@sina.cn
* create on 2019/4/15
*/
public class UseThreadFactory {private static ThreadFactory namedFactory = new ThreadFactoryBuilder().setNameFormat("线程-demo-%d").build();private static ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, newArrayBlockingQueue<>(10), namedFactory, new ThreadPoolExecutor.AbortPolicy());public static void main(String[] args) {for (int i = 1; i <= 14; i++) {Callable<Boolean> task = createTask(i);pool.submit(task);System.out.println("after task:" + i + " submitted, current active count: "+ pool.getActiveCount() + ", size of queue: " + pool.getQueue().size());}pool.shutdown();}/*** @Author Xu hao* @Description 创建任务* @Date 2019/3/19 0:08* @param i* @return java.util.concurrent.Callable<java.lang.Boolean>**/private static Callable<Boolean> createTask(int i){Callable<Boolean> callable = () -> {TimeUnit.SECONDS.sleep(10);System.out.println("thread: " + Thread.currentThread().getName() + " execute task: " + i);return true;};return callable;}
}

当然,我们也可以自定义ThreadFactory,举例如下:

package cc.mynatapp.detroitdentist.current;import com.google.common.util.concurrent.ThreadFactoryBuilder;import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;/**
* @author Xu hao
* @Description ThreadFactory的使用
* @Version 1.0
* Email 15229357319@sina.cn
* create on 2019/4/15
*/
public class UseThreadFactory {/*** 自定义ThreadFactory**/private static ThreadFactory namedFactory = nameThreadFactory();private static ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, newArrayBlockingQueue<>(10), namedFactory, new ThreadPoolExecutor.AbortPolicy());public static void main(String[] args) {for (int i = 1; i <= 14; i++) {Callable<Boolean> task = createTask(i);pool.submit(task);System.out.println("after task:" + i + " submitted, current active count: "+ pool.getActiveCount() + ", size of queue: " + pool.getQueue().size());}pool.shutdown();}/*** @Author Xu hao* @Description 创建任务* @Date 2019/3/19 0:08* @param i* @return java.util.concurrent.Callable<java.lang.Boolean>**/private static Callable<Boolean> createTask(int i){Callable<Boolean> callable = () -> {TimeUnit.SECONDS.sleep(10);System.out.println("thread: " + Thread.currentThread().getName() + " execute task: " + i);return true;};return callable;}/*** @Author Xu hao* @Description 自定义ThreadFactory* @Date 2019/4/19 23:28* @param* @return java.util.concurrent.ThreadFactory**/private static ThreadFactory nameThreadFactory(){AtomicInteger tag = new AtomicInteger(1);ThreadFactory factory = (Runnable r) -> {Thread thread = new Thread(r);thread.setName("线程-demo-" + tag.getAndIncrement());return thread;};return factory;}}

运行上面两种方法的举例都可以得到如下日志输出,我们可以看到线程池中的线程被命名为“线程-demo-%d”了

Java并发25 ThreadFactory使用的必要性相关推荐

  1. java并发实战编程pdf_「原创」Java并发编程系列25 | 交换器Exchanger

    2020年Java面试题库连载中 [000期]Java最全面试题库思维导图 [001期]JavaSE面试题(一):面向对象 [002期]JavaSE面试题(二):基本数据类型与访问修饰符 [003期] ...

  2. Java并发编程与技术内幕:ThreadFactory、ThreadLocal

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了ThreadFactory.ThreadLocal的实例和源码解析 一.Th ...

  3. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)

    多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...

  4. 面试问到java并发_那些面试官必问的JAVA多线程和并发面试题及回答

    Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...

  5. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  6. java并发编程(更新)

    概念理解:①串行程序②并发程序: 线程安全问题: 同一进程中的所有线程共享进程中的内存地址空间.如果没有明确的同步机制来管理共享数据,那么当一个线程正在使用某个变量时,另一个线程可能同时访问这个变量, ...

  7. futuretask java 并发请求_Java面试题整理一(侧重多线程并发)

    1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...

  8. 【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)

    目录 一.基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有 ...

  9. Java 并发在项目中的使用场景

    1.并发编程的三个核心问题: (1)分工:所谓分工指的是如何高效地拆解任务并分配给线程 (2)同步:而同步指的是线程之间如何协作 (3)互斥:互斥则是保证同一时刻只允许一个线程访问共享资源 (4)应用 ...

  10. Java并发指南14:Java并发容器ConcurrentSkipListMap与CopyOnWriteArrayList

    原文出处http://cmsblogs.com/ 『chenssy』 到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash.TreeMap,这两种数据结构各自都有着优缺 ...

最新文章

  1. Swift编程语言学习10—— 枚举属性监视器
  2. [转载]浅析jQuery框架与构造对象
  3. 任意组合指令达到免杀
  4. SQL Server定时执行SQL语句
  5. 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型
  6. 景观分析工具:arcgis中patch analysis模块
  7. 英伟达 | 深度学习GPU最新情况
  8. Python编程中一定要注意的那些“坑”(二)
  9. 武电实业卡密接口对接经验分享
  10. SpringCloud使用Prometheus监控(基于Eureka)
  11. paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar
  12. 控制工程实践(7)——PID四种类型控制器(之比例控制器P)
  13. 计算机字节换算在线,计算机字节换算(计算机字节换算器)
  14. 财务会计中会计科目的基础
  15. 怎么购买虚拟主机合适?
  16. “甲骨文”的传奇故事
  17. excel根据颜色赋值 Excel填充颜色单元格替换成数字 excel把所有红色变成1
  18. 排查docker cpu占用过高问题
  19. github 修改密码密码_雇主要求提供GitHub密码。 如何处理呢?
  20. MYSQL----数据库

热门文章

  1. 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗。
  2. QT 信号toggled triggered区别
  3. 今晚与小妹亚美合作了一把qq游戏,大获全胜!
  4. 用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
  5. Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】
  6. 网页设计语言html做思维导图,web网页实现思维导图展示
  7. php的seeder是什么,laravel利用seeder实现数据表中填充数据
  8. android锁屏界面布局修改,android 修改锁屏界面
  9. Backtrader量化平台教程(六)Analyzer
  10. 文本分类,数据挖掘和机器学习