根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
JDK中的介绍:

An object that creates new threads on demand. Using thread factories removes hardwiring of calls tonew Thread, enabling applications to use special thread subclasses, priorities, etc.

The simplest implementation of this interface is just:

[java] view plaincopy print?
  1. class SimpleThreadFactory implements ThreadFactory {
  2. public Thread newThread(Runnable r) {
  3. return new Thread(r);
  4. }
  5. }

The Executors.defaultThreadFactory method provides a more useful simple implementation, that sets the created thread context to known values before returning it.

[java] view plaincopy print?
  1. /**
  2. * The default thread factory
  3. */
  4. static class DefaultThreadFactory implements ThreadFactory {
  5. static final AtomicInteger poolNumber = new AtomicInteger(1);
  6. final ThreadGroup group;
  7. final AtomicInteger threadNumber = new AtomicInteger(1);
  8. final String namePrefix;
  9. DefaultThreadFactory() {
  10. SecurityManager s = System.getSecurityManager();
  11. group = (s != null)? s.getThreadGroup() :
  12. Thread.currentThread().getThreadGroup();
  13. namePrefix = "pool-" +
  14. poolNumber.getAndIncrement() +
  15. "-thread-";
  16. }
  17. public Thread newThread(Runnable r) {
  18. Thread t = new Thread(group, r,
  19. namePrefix + threadNumber.getAndIncrement(),
  20. 0);
  21. if (t.isDaemon())
  22. t.setDaemon(false);
  23. if (t.getPriority() != Thread.NORM_PRIORITY)
  24. t.setPriority(Thread.NORM_PRIORITY);
  25. return t;
  26. }
  27. }

下面写一简单示例。

[java] view plaincopy print?
  1. package com.test;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.ThreadFactory;
  5. class Task implements Runnable{
  6. int taskId;
  7. public Task(int taskId) {
  8. this.taskId=taskId;
  9. }
  10. @Override
  11. public void run() {
  12. System.out.println(Thread.currentThread().getName()+"--taskId: "+taskId);
  13. }
  14. }
  15. class DaemonThreadFactory implements ThreadFactory {
  16. @Override
  17. public Thread newThread(Runnable r) {
  18. Thread t=new Thread(r);
  19. t.setDaemon(true);
  20. return t;
  21. }
  22. }
  23. public class ThreadFactoryTest {
  24. public static void main(String[] args) {
  25. ExecutorService exec=Executors.newFixedThreadPool(3,new DaemonThreadFactory());
  26. for(int i=0;i<3;i++) {
  27. exec.submit(new Task(i));
  28. }
  29. exec.shutdown();
  30. }
  31. }

输出如下:

Thread-0--taskId: 0
Thread-1--taskId: 1
Thread-2--taskId: 2
分析:
DaemonThreadFactory中覆写的newThread()方法与submit()方法的调用关系,也就是说DaemonThreadFactory是如何起作用的。
调试输出其调用关系:
也就是说,submit()时会调用DaemonThreadFactory类的newThread()方法来创建线程。

转载于:https://www.cnblogs.com/yaowen/p/6069628.html

ThreadFactory相关推荐

  1. JDK线程池的ThreadFactory

    JDK线程池:Executors.newFixedThreadPool , Executors.newSingleThreadExecutor,由一个ThreadFactory来创建新的线程,默认情况 ...

  2. 13、Excutors 结合 ThreadFactory 自动给线程加上线程名

    2019独角兽企业重金招聘Python工程师标准>>> 1.需求场景 很多时候我们都会使用线程池,而且是使用多个线程池,比如在:生产者和消费者模型中,生产者线程放到一个线程池里面,而 ...

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

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

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

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

  5. Java ThreadFactory接口用法

    根据需要创建新线程的对象.使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类.属性等等. JDK中的介绍: An object that creates ...

  6. Java线程(五):Executors、ThreadFactory

    Executors public class Executors 一个功能非常强大的辅助类. 此包中所定义的 Executor.ExecutorService.ScheduledExecutorSer ...

  7. 面试高频——JUC并发工具包快速上手(超详细总结)

    目录 一.什么是JUC 二.基本知识 2.1.进程和线程 2.2.Java默认有两个进程 2.3.Java能够开启线程吗? 2.4.并发和并行 2.5.线程的状态 2.6.wait和sleep的区别 ...

  8. Android线程池简单使用

    线程池使用的好处: 1)对多个线程进行统一地管理,避免资源竞争中出现的问题. 2)对线程进行复用,线程在执行完任务后不会立刻销毁,而会等待另外的任务,这样就不会频繁地创建.销毁线程和调用GC. 使用T ...

  9. 深入理解Java线程池:ThreadPoolExecutor

    线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线 ...

最新文章

  1. JavaScript(循环)
  2. 2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II
  3. 圆柱体积怎么算立方公式_【六年级数学微课】巧算圆锥的体积
  4. redis 2m数据读取_Flink读写Redis(二)读取redis数据
  5. ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
  6. 深度装机大师一键重装_笔记本怎么重装系统?笔记本自己如何重装系统?
  7. 通过代码解决全角问题类调用法
  8. tensorflow : gfile 函数
  9. Unity3d 局域网小游戏DEMO学习
  10. WIZ ConfigTool-批量配置WIZnet S2E模块
  11. (九)练习:美萍酒店管理系统-系统设置-删除类型、删除房间
  12. ABAP 供应商主数据比较常用的表
  13. C/C++编程:仿函数
  14. 唐珂:国外农业物联网技术发展及对我国的启示
  15. python中count什么意思_python中函数COUNT()的功能是什么
  16. #Geek Talk# AI and FinTech,投资阿里巴巴的 Benson Tam 也会跟大家一起 Talk
  17. 120帧手机动态壁纸_小英雄高清动态壁纸app下载-小英雄高清动态壁纸v2.6手机下载...
  18. UFI模式下GPT分区安装win8
  19. verilog多数表决器
  20. 服务器文件夹 删除 修改 日志,win服务器 删除文件夹

热门文章

  1. JS使png背景图片透明
  2. How run Powershell ISE on WIndows Server2008
  3. 机房收费--一般用户
  4. 面试官问:你讲讲分布式事务问题的几种方案?
  5. 5分钟图解Hbase列式存储
  6. 从平台到中台 | Elaticsearch 在蚂蚁金服的实践经验
  7. 图解 Elasticsearch 原理
  8. 数据库:数据库死机和掉电时如何让恢复数据
  9. mysql哪些优化手段_mysql explain 及常见优化手段
  10. docker容器 eureka 集成_微服务:基于 Docker 的微服务架构之分布式企业级实践参考...