2019独角兽企业重金招聘Python工程师标准>>>

1、需求场景

很多时候我们都会使用线程池,而且是使用多个线程池,比如在:生产者和消费者模型中,生产者线程放到一个线程池里面,而消费者线程放到另一个线程池里面,这个时候我们可以借助ThreadFactory给这两类线程加个线程名字前缀,比如:producer_xxx和consumer_xxx,这样子在使用Java的 jstack pid | grep XXX 命令就能够很好地区分哪些线程属于生产者线程,哪些数据消费者线程

2、实现原理

1、代码示例:

  • 1、Executors:

  • 2、factory:

2、代码流程(其实就是第三行的时候使用了Thread构造方法)

Excutors.newFixedThreadPool() ==>

ThreadFactory.newThread(Runnable runnable) ==>

new Thread(mGroup, runnable, name, 0)

3、完整代码案例

  • 1、ExcutorsUse.java

      package threadfactory;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/*** [@Author](https://my.oschina.net/arthor) liufu* [@Company](https://my.oschina.net/u/3478402) 任子行网络技术股份有限公司* @CreateTime 2017/9/30  16:46*/public class ExcutorsUse {public static void main(String[] args) {ExecutorService prodPool = Executors.newFixedThreadPool(5, new ThreadFactoryTest("producer-thread-", false));ExecutorService consuPool = Executors.newFixedThreadPool(5, new ThreadFactoryTest("consumer-thread-", false));for (int i = 0; i < 5; i++){prodPool.execute(new ProducerThread());}for (int i = 0; i < 5; i++){consuPool.execute(new ConsumerThread());}}}
    
  • 2、ThreadFactoryTest.java

      package threadfactory;import java.util.concurrent.ThreadFactory;import java.util.concurrent.atomic.AtomicInteger;/*** [@Author](https://my.oschina.net/arthor) liufu* [@Company](https://my.oschina.net/u/3478402) 任子行网络技术股份有限公司* @CreateTime 2017/9/30  16:34*/public class ThreadFactoryTest implements ThreadFactory {// 原子变量线程id自增private final AtomicInteger mThreadNum = new AtomicInteger(1);private String prefixName;private boolean demo;private ThreadGroup tGroup;public ThreadFactoryTest(String prefixName, boolean demo){this.prefixName = prefixName;this.demo = demo;SecurityManager sm = System.getSecurityManager();this.tGroup = sm == null ? Thread.currentThread().getThreadGroup() : sm.getThreadGroup();}@Overridepublic Thread newThread(Runnable runnable) {String threadName = prefixName + "-" + mThreadNum.getAndIncrement();Thread trd = new Thread(tGroup, runnable, threadName);trd.setDaemon(demo);return trd;}}
    
  • 3、ProducerThread.java

      package threadfactory;/*** @Author liufu* @Company 任子行网络技术股份有限公司* @CreateTime 2017/9/30  16:54*/public class ProducerThread implements Runnable {@Overridepublic void run() {while (true) {System.out.println("i am producer");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
    
  • 4、ConsumerThread.java

      package threadfactory;/*** @Author liufu* @Company 任子行网络技术股份有限公司* @CreateTime 2017/9/30  16:55*/public class ConsumerThread implements Runnable {@Overridepublic void run() {while (true) {System.out.println("i am consumer");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
    

转载于:https://my.oschina.net/liufukin/blog/2222466

13、Excutors 结合 ThreadFactory 自动给线程加上线程名相关推荐

  1. JAVA高并发工作笔记0002---高并发编程之使用ThreadFactory来创建新的线程

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 首先来构建线程封装类WorkThread,该类的功能主要是为了能够更好的管理线程而创建的 publ ...

  2. php教程链接,php自动给网址加上链接的方法,php网址链接方法_PHP教程

    php自动给网址加上链接的方法,php网址链接方法 本文实例讲述了php自动给网址加上链接的方法.分享给大家供大家参考.具体实现方法如下: 这里自动匹配页面里的网址,包含http,ftp等,自动给网址 ...

  3. 13天Java进阶笔记-day7-异常、线程

    第一章 异常 异常的概述和体系 异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个 ...

  4. 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)

    用Linux/ C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架 前言 服务器端源码 客户端源码 自定义库 helper.c 和 helper.h helper.c helper.h M ...

  5. Linux系统编程---13(线程控制函数,创建线程,循环创建多个线程,线程间共享全局变量)

    线程控制 操作系统并没有提供创建线程的系统调用接口,因此大佬们封装了一个线程的接口库实现线程控制.意为着用户创建线程都使用的是库函数(所以有时候我们说创建的线程是一个用户态线程,但是在内核中对应有一个 ...

  6. python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?

    1.进程.线程.线程池的概念 进程是一个动态的过程,是一个活动的实体.简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者.可以说,进程中包含了多个可以同时运行的线程 ...

  7. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

  8. 从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池

    本文原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.有少许改动. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关 ...

  9. java线程cutdown_Java线程池实现原理与技术II

    为了能够更好地控制多线程,JDK提供了一套Executor框架,帮助开发人员有效地进行线程控制.Executor框架无论是newFixedThreadPool()方法.newSingleThreadE ...

最新文章

  1. Angular 4 依赖注入教程之一 依赖注入简介
  2. IOS开发笔记6-C语言基础复习
  3. python中的魔法属性和方法
  4. 以QQ传输文件为例-设计测试用例
  5. qt下设置按钮不接收键盘鼠标但能响应 clicked()信号
  6. initial、inherit、unset、revert和all
  7. VB2015编写的九宫格拼图游戏及暴力求解解法(主要使用datagridview和listbox控件)
  8. 视频服务器显示存储离线,云端服务器显示离线咋会事
  9. Java中dynamic是什么_java中dynamic web project与web project 的区别
  10. 微信开发者工具控制台空白问题解决方案
  11. Gym - 101350E-Competitive Seagulls-博弈-思维
  12. 吴裕雄 18-MySQL GROUP BY 语句
  13. 面向万物智联的云原生网络
  14. upload-labs刷关记录
  15. GM300写频软件的使用
  16. 转载:Python 的关键字 yield 有哪些用法和用途?
  17. LeetCode 力扣算法题解汇总,All in One
  18. php选择星座,PHP日期得到星座
  19. Win10 设置显示 ClearType 的设置
  20. 手表未能连接服务器怎么办,守护云手表未连服务器

热门文章

  1. BBED修复DB启动问题
  2. eclipse 快捷键文件地址
  3. Hadoop的HA机制原理解析,与HA高可用集群环境搭建
  4. 好程序员web前端分享HTML基础篇
  5. 照葫芦画瓢-class(类)
  6. Linux C编程之二:Linux基础
  7. Android Studio的使用(三)--包不分级、修改包名
  8. emmet中文文档 (转载)
  9. Lua中的模块与module函数详解
  10. C#数据导出Excel详细介绍