ThreadFactory

简介:
根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 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 plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  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 plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  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.   
  10.         DefaultThreadFactory() {  
  11.             SecurityManager s = System.getSecurityManager();  
  12.             group = (s != null)? s.getThreadGroup() :  
  13.                                  Thread.currentThread().getThreadGroup();  
  14.             namePrefix = "pool-" +  
  15.                           poolNumber.getAndIncrement() +  
  16.                          "-thread-";  
  17.         }  
  18.   
  19.         public Thread newThread(Runnable r) {  
  20.             Thread t = new Thread(group, r,  
  21.                                   namePrefix + threadNumber.getAndIncrement(),  
  22.                                   0);  
  23.             if (t.isDaemon())  
  24.                 t.setDaemon(false);  
  25.             if (t.getPriority() != Thread.NORM_PRIORITY)  
  26.                 t.setPriority(Thread.NORM_PRIORITY);  
  27.             return t;  
  28.         }  
  29.     }  

下面写一简单示例。
[java]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. package com.test;  
  2.   
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.ThreadFactory;  
  6.   
  7. class Task implements Runnable{  
  8.     int taskId;  
  9.     public Task(int taskId) {  
  10.         this.taskId=taskId;  
  11.     }  
  12.       
  13.     @Override  
  14.     public void run() {  
  15.         System.out.println(Thread.currentThread().getName()+"--taskId: "+taskId);  
  16.           
  17.     }  
  18. }  
  19.   
  20. class DaemonThreadFactory implements ThreadFactory {  
  21.     @Override  
  22.     public Thread newThread(Runnable r) {  
  23.         Thread t=new Thread(r);  
  24.         t.setDaemon(true);  
  25.         return t;  
  26.     }  
  27.       
  28. }  
  29. public class ThreadFactoryTest {  
  30.     public static void main(String[] args) {  
  31.         ExecutorService exec=Executors.newFixedThreadPool(3,new DaemonThreadFactory());  
  32.         for(int i=0;i<3;i++) {  
  33.             exec.submit(new Task(i));  
  34.         }  
  35.         exec.shutdown();  
  36.     }  
  37. }  

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


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6069628.html,如需转载请自行联系原作者
相关文章
|
12月前
|
自然语言处理 语音技术 开发者
开源上新|FunASR多语言离线文件转写软件包
开源上新|FunASR多语言离线文件转写软件包
|
11月前
|
人工智能 Kubernetes API
3分钟掌握合同比对,思通数科开源工具让法律审查更高效
思通数科AI多模态平台提供开放API,支持与法律机构常用的ERP、CRM等企业系统集成。平台具备Docker、Kubernetes兼容性,支持二次开发和模块扩展,使用户能灵活应对不同业务需求。
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
218 2
|
消息中间件 Java Kafka
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
|
11月前
|
Java 索引
Java“ExceptionInInitializerError”解决
Java中遇到“ExceptionInInitializerError”错误通常是因为静态初始化块或静态变量初始化时发生异常。解决方法包括检查静态代码块中的逻辑错误、确保资源正确加载以及处理可能的空指针异常。
1965 8
|
机器学习/深度学习 人工智能 算法
2024通义语音AI技术图景,大模型引领AI再进化(2)
2024通义语音AI技术图景,大模型引领AI再进化(2)
|
前端开发 Java API
一文教会你如何简单使用Fegin进行远程服务调用
这篇文章介绍了如何在分布式微服务架构中使用Feign进行远程服务调用,包括Feign的基本介绍、使用步骤,以及在项目中的实际运用方法,并通过测试验证了调用远程服务的成功性。
一文教会你如何简单使用Fegin进行远程服务调用
|
负载均衡 jenkins 应用服务中间件
大规模部署下的 Jenkins 高可用性与负载均衡
【8月更文第31天】随着软件开发流程的加速,持续集成/持续交付(CI/CD)工具的重要性日益凸显。Jenkins 作为最受欢迎的 CI/CD 平台之一,为企业提供了强大的自动化构建和部署功能。然而,在大规模部署场景下,单一的 Jenkins 实例可能无法满足高可用性和性能的需求。本文将探讨如何设计和实施 Jenkins 高可用集群,以支持大型组织的需求,并通过负载均衡技术来提高系统的稳定性和响应速度。
771 0
|
存储 大数据 数据安全/隐私保护
【专栏】带你了解 S3 背后的故事,为我们的数字世界提供坚实的存储基础
【4月更文挑战第28天】S3,亚马逊的简单存储服务协议,是云存储的事实标准,以其易用、高效和可靠的对象存储闻名。核心概念包括桶(存储单元)、对象(独立数据实体)和区域(地理分布)。S3 提供弹性存储、高可用性、数据安全和成本效益,广泛应用于备份、大数据、网站存储等。其成功推动了云存储市场发展,促进了数据存储创新,成为云存储领域不可或缺的部分。
2933 0
|
存储 关系型数据库 Apache
Apache Doris 实时数据仓库的构建与技术选型方案
Apache Doris 实时数据仓库的构建与技术选型方案
1900 32