JDK线程池的ThreadFactory

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

JDK线程池:Executors.newFixedThreadPool , Executors.newSingleThreadExecutor,由一个ThreadFactory来创建新的线程,默认情况下为Executors.defaultThreadFactory(),ThreadFactory接口:

 
  1. public interface ThreadFactory {  
  2.     Thread newThread(Runnable r);  

我们可以采用自定义的ThreadFactory工厂,增加对线程创建与销毁等更多的控制,

一个简单的例子,跟踪线程的创建与销毁:

 
  1. package org.guojje.threadpool;  
  2.  
  3. import java.util.concurrent.atomic.AtomicInteger;  
  4.  
  5. public class WorkThread extends Thread {  
  6.  
  7.     private Runnable target;  
  8.     private AtomicInteger counter;  
  9.  
  10.     public WorkThread(Runnable target, AtomicInteger counter) {  
  11.         this.target = target;  
  12.         this.counter = counter;  
  13.     }  
  14.  
  15.     @Override 
  16.     public void run() {  
  17.         try {  
  18.             target.run();  
  19.         } finally {  
  20.             int c = counter.getAndDecrement();  
  21.             System.out.println("terminate no " + c + " Threads");  
  22.         }  
  23.     }  
 
  1. package org.guojje.threadpool;  
  2.  
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.ThreadFactory;  
  6. import java.util.concurrent.TimeUnit;  
  7. import java.util.concurrent.atomic.AtomicInteger;  
  8.  
  9. public class MyThread implements Runnable {  
  10.       
  11.       
  12.     public static void main(String[] args) {  
  13.        ExecutorService ctp =  Executors.newCachedThreadPool(new ThreadFactory() {  
  14.             private AtomicInteger count = new AtomicInteger();  
  15.             public Thread newThread(Runnable r) {  
  16.                 int c = count.incrementAndGet();  
  17.                 System.out.println("create no " + c + " Threads");  
  18.                 return new WorkThread(r,count);  
  19.                   
  20.             }  
  21.         });  
  22.          
  23.        ctp.execute(new MyThread());  
  24.        ctp.execute(new MyThread());  
  25.        ctp.execute(new MyThread());  
  26.        ctp.execute(new MyThread());  
  27.        ctp.execute(new MyThread());  
  28.        ctp.execute(new MyThread());  
  29.          
  30.        ctp.shutdown();  
  31.         try {  
  32.             ctp.awaitTermination(1200, TimeUnit.SECONDS);  
  33.         } catch (InterruptedException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.       
  38.     public void run(){  
  39.         System.out.println("complete a task!!!");  
  40.     }  
  41. }  

可以看到在执行这个过程中,共创建过几个线程。


本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/650981

相关文章
|
6月前
|
Java 调度 开发者
JDK 21中的虚拟线程:轻量级并发的新篇章
本文深入探讨了JDK 21中引入的虚拟线程(Virtual Threads)概念,分析了其背后的设计哲学,以及与传统线程模型的区别。文章还将讨论虚拟线程如何简化并发编程,提高资源利用率,并展示了一些使用虚拟线程进行开发的示例。
1059 4
|
6月前
|
缓存 安全 Java
JDK8线程池BUG引发的思考
JDK8线程池BUG引发的思考
149 0
|
6月前
|
存储 缓存 并行计算
【面试问题】JDK并发类库提供的线程池实现有哪些?
【1月更文挑战第27天】【面试问题】JDK并发类库提供的线程池实现有哪些?
|
12月前
|
算法 安全 Java
【Java】JDK 21中的虚拟线程以及其他新特性
【Java】JDK 21中的虚拟线程以及其他新特性
210 0
|
29天前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
|
13天前
|
监控 数据可视化 Java
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
如何使用JDK自带的监控工具JConsole来监控线程池的内存使用情况?
|
2月前
|
监控 数据可视化 Java
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
|
3月前
|
缓存 Java 调度
【Java 并发秘籍】线程池大作战:揭秘 JDK 中的线程池家族!
【8月更文挑战第24天】Java的并发库提供多种线程池以应对不同的多线程编程需求。本文通过实例介绍了四种主要线程池:固定大小线程池、可缓存线程池、单一线程线程池及定时任务线程池。固定大小线程池通过预设线程数管理任务队列;可缓存线程池能根据需要动态调整线程数量;单一线程线程池确保任务顺序执行;定时任务线程池支持周期性或延时任务调度。了解并正确选用这些线程池有助于提高程序效率和资源利用率。
51 2
|
3月前
|
算法 Java
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
|
5月前
|
存储 网络协议 Java
【JDK21】详解虚拟线程
【JDK21】详解虚拟线程
175 0