经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
面试官:如何自定义一个工厂类给线程池命名,我:现场手撕吗?
来源:cnblogs  作者:JavaBuild  时间:2024/6/11 9:57:03  对本文有异议

面试场景模拟

面试官:小伙子平时开发中用过线程池吗?聊一聊它
我:肯定用过啊,然后把build的线程池十八问一顿巴拉巴拉
面试官:不错不错,挺了解的嘛,那你知道怎么给线程池命名?手写一个工厂类给线程池命名吧
我:啊这,现场手撕吗?面试官默默的递上A4...


? ?如何给线程池命名?这是一个好问题,如果我们的项目模块较多,在运行时调用了不同模块的线程池,为了在发生异常后快速定位问题,我们一般会在构建线程池时给它一个名字,这里我们提供几种线程池命名的方法。

方法一: 通过Spring 框架提供的CustomizableThreadFactory命名

  1. ThreadFactory springThreadFactory = new CustomizableThreadFactory("Spring线程池:");
  2. ExecutorService exec = new ThreadPoolExecutor(1, 1,
  3. 0L, TimeUnit.MILLISECONDS,
  4. new LinkedBlockingQueue<Runnable>(10),springThreadFactory);
  5. exec.submit(() -> {
  6. log.info(exec.toString());
  7. });

方法二: 通过Google guava工具类提供的ThreadFactoryBuilder命名

  1. //链式调用
  2. ThreadFactory guavaThreadFactory = new ThreadFactoryBuilder().setNameFormat("guava线程池:").build();
  3. ExecutorService exec = new ThreadPoolExecutor(1, 1,
  4. 0L, TimeUnit.MILLISECONDS,
  5. new LinkedBlockingQueue<Runnable>(10),guavaThreadFactory );
  6. exec.submit(() -> {
  7. log.info(exec.toString());
  8. });

? ?其实还有一个是Apache commons-lang3 提供的 BasicThreadFactory工厂类,也可以给线程池命名,咱这里就不贴代码了,原因是他们的本质都是通过Thread 的setName()方法实现的!所以,我们其实自己也可以设计一个工厂类也实现线程池的命名操作!

方法三: 自定义工厂类实现线程池命名

先定义一个工厂类,通过实现ThreadFactory的newThread方法,完成命名。

  1. public class MyThreadFactory implements ThreadFactory {
  2. private final AtomicInteger threadNum = new AtomicInteger();
  3. private final String name;
  4. /**
  5. * 创建一个带名字的线程池生产工厂
  6. */
  7. public MyThreadFactory(String name) {
  8. this.name = name;
  9. }
  10. @Override
  11. public Thread newThread(Runnable r) {
  12. Thread t = new Thread(r);
  13. t.setName(name + "-" + threadNum.incrementAndGet());
  14. return t;
  15. }
  16. }

调用一下看看结果:

  1. @Slf4j
  2. public class Test {
  3. public static void main(String[] args) {
  4. MyThreadFactory myThreadFactory = new MyThreadFactory("javaBuild-pool");
  5. ExecutorService exec = new ThreadPoolExecutor(1, 1,
  6. 0L, TimeUnit.MILLISECONDS,
  7. new LinkedBlockingQueue<Runnable>(10),myThreadFactory);
  8. exec.submit(() -> {
  9. log.info(exec.toString());
  10. });
  11. }
  12. }

输出:

  1. 17:46:37.387 [javaBuild-pool-1] INFO com.javabuild.server.pojo.Test - java.util.concurrent.ThreadPoolExecutor@1ee7d6d6[Running, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]

原文链接:https://www.cnblogs.com/JavaBuild/p/18239622

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号