Java并发25 ThreadFactory使用的必要性
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使用的必要性相关推荐
- java并发实战编程pdf_「原创」Java并发编程系列25 | 交换器Exchanger
2020年Java面试题库连载中 [000期]Java最全面试题库思维导图 [001期]JavaSE面试题(一):面向对象 [002期]JavaSE面试题(二):基本数据类型与访问修饰符 [003期] ...
- Java并发编程与技术内幕:ThreadFactory、ThreadLocal
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了ThreadFactory.ThreadLocal的实例和源码解析 一.Th ...
- 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)
多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...
- 面试问到java并发_那些面试官必问的JAVA多线程和并发面试题及回答
Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...
- [转]Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- java并发编程(更新)
概念理解:①串行程序②并发程序: 线程安全问题: 同一进程中的所有线程共享进程中的内存地址空间.如果没有明确的同步机制来管理共享数据,那么当一个线程正在使用某个变量时,另一个线程可能同时访问这个变量, ...
- futuretask java 并发请求_Java面试题整理一(侧重多线程并发)
1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...
- 【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)
目录 一.基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有 ...
- Java 并发在项目中的使用场景
1.并发编程的三个核心问题: (1)分工:所谓分工指的是如何高效地拆解任务并分配给线程 (2)同步:而同步指的是线程之间如何协作 (3)互斥:互斥则是保证同一时刻只允许一个线程访问共享资源 (4)应用 ...
- Java并发指南14:Java并发容器ConcurrentSkipListMap与CopyOnWriteArrayList
原文出处http://cmsblogs.com/ 『chenssy』 到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash.TreeMap,这两种数据结构各自都有着优缺 ...
最新文章
- Swift编程语言学习10—— 枚举属性监视器
- [转载]浅析jQuery框架与构造对象
- 任意组合指令达到免杀
- SQL Server定时执行SQL语句
- 【youcans 的 OpenCV 例程 200 篇】104. 运动模糊退化模型
- 景观分析工具:arcgis中patch analysis模块
- 英伟达 | 深度学习GPU最新情况
- Python编程中一定要注意的那些“坑”(二)
- 武电实业卡密接口对接经验分享
- SpringCloud使用Prometheus监控(基于Eureka)
- paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar
- 控制工程实践(7)——PID四种类型控制器(之比例控制器P)
- 计算机字节换算在线,计算机字节换算(计算机字节换算器)
- 财务会计中会计科目的基础
- 怎么购买虚拟主机合适?
- “甲骨文”的传奇故事
- excel根据颜色赋值 Excel填充颜色单元格替换成数字 excel把所有红色变成1
- 排查docker cpu占用过高问题
- github 修改密码密码_雇主要求提供GitHub密码。 如何处理呢?
- MYSQL----数据库
热门文章
- 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗。
- QT 信号toggled triggered区别
- 今晚与小妹亚美合作了一把qq游戏,大获全胜!
- 用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
- Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】
- 网页设计语言html做思维导图,web网页实现思维导图展示
- php的seeder是什么,laravel利用seeder实现数据表中填充数据
- android锁屏界面布局修改,android 修改锁屏界面
- Backtrader量化平台教程(六)Analyzer
- 文本分类,数据挖掘和机器学习