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中提供了哪些线程池】
【JDK中提供了哪些线程池】
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
本篇 《如何处理 JDK 线程池内线程执行异常》 这篇文章适合哪些小伙伴阅读呢? 适合工作中使用线程池却不知异常的处理流程,以及不知如何正确处理抛出的异常
|
SpringCloudAlibaba Java Go
JDK 线程池使用不当引发的饥饿死锁问题
JDK 线程池使用不当引发的饥饿死锁问题
122 0
JDK 线程池使用不当引发的饥饿死锁问题
|
存储 监控 Java
JDK 线程池如何保证核心线程不被销毁
JDK 线程池如何保证核心线程不被销毁
398 0
JDK 线程池如何保证核心线程不被销毁
|
Dubbo 搜索推荐 Java
如何解决JDK线程池中不超过最大线程数下快速消费任务
如何解决JDK线程池中不超过最大线程数下快速消费任务
100 0
如何解决JDK线程池中不超过最大线程数下快速消费任务
|
存储 缓存 监控
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(下)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(下)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(下)
|
缓存 Java 应用服务中间件
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(中)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(中)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(中)
|
存储 缓存 算法
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(上)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(上)
如果你是 JDK 设计者,如何设计线程池?我跟面试官大战了三十个回合(上)
|
Java 应用服务中间件 容器
Tomcat是如何修正JDK原生线程池bug的?
为提高处理能力和并发度,Web容器一般会把处理请求的任务放到线程池,而JDK的原生线程池先天适合CPU密集型任务,于是Tomcat改造之。
117 0
Tomcat是如何修正JDK原生线程池bug的?
|
Java 数据库连接 数据库
从JDK源码角度看线程池原理
        “池”技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实现类由不同厂商实现,数据库连接的建立和销毁都是很耗时耗资源的操作,为了查询数据库中某条记录,最原始的一个过程是建立连接、发送查询语句、返回查询结果、销毁连接,假如仅仅是一个很简单的查询语句,那么可能建立连接与销毁连接两个步骤就已经占所有资源时间消耗的绝大部分,如此低下的效率显然让人无法接受。
785 0