ThreadFactory类的使用

  之前创建线程的话,基本上是使用new Thread(),或者是将任务提交到线程池执行。今天看了一下洁城浩的《图解java多线程设计模式》突然看到还可以使用ThreadFactory来创建一个线程,感觉挺新奇的,就写了一个Example类来跑一下 。

 

 1 public class ThreadFactoryExample {
 2     public static void main(String[] args) {
 3         ThreadFactory factory = Executors.defaultThreadFactory();
 4         factory.newThread(new Task()).start();
 5         for (int i = 0; i < 10; i++) {
 6             System.out.println("Hello");
 7         }
 8     }
 9 }
10 
11 class Task implements Runnable {
12 
13     @Override
14     public void run() {
15         for (int i = 0; i < 10; i++) {
16             System.out.println("Task");
17         }
18     }
19 }

 

  挺简单的使用方式。看了一下,Executors工具类返回的是DefaultThreadFactory类的实例,这个类的是一个Executors的内部类,代码很少,如下

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

 

  

 

转载于:https://www.cnblogs.com/oreo/p/8026705.html

ThreadPoolExecutor的ThreadFactory是用于创建线程的工厂。它定义了如何创建新的线程对象,并且可以自定义线程的属性和行为。 要使用ThreadFactory,需要实现ThreadFactory接口,并重写其中的newThread方法。newThread方法接收一个Runnable对象作为参数,并返回一个新创建的Thread对象。 下面是一个示例代码,演示如何使用ThreadFactory创建线程池: ```java import java.util.concurrent.*; public class CustomThreadFactory implements ThreadFactory { private final String threadNamePrefix; private final AtomicInteger threadNumber = new AtomicInteger(1); public CustomThreadFactory(String threadNamePrefix) { this.threadNamePrefix = threadNamePrefix; } @Override public Thread newThread(Runnable r) { Thread t = new Thread(r, threadNamePrefix + threadNumber.getAndIncrement()); // 设置线程属性,例如优先级、守护线程等 t.setPriority(Thread.NORM_PRIORITY); t.setDaemon(false); return t; } } public class Main { public static void main(String[] args) { // 创建自定义的ThreadFactory ThreadFactory threadFactory = new CustomThreadFactory("MyThread-"); // 创建线程池,并指定ThreadFactory ThreadPoolExecutor executor = new ThreadPoolExecutor( 5, 10, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(), threadFactory); // 提交任务给线程池执行 executor.execute(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); }); // 关闭线程池 executor.shutdown(); } } ``` 在上面的示例中,我们创建了一个CustomThreadFactory,实现了ThreadFactory接口,并重写了newThread方法。在newThread方法中,我们创建了一个新的Thread对象,并设置了线程的名称、优先级和守护线程属性。 然后,在主函数中,我们创建了一个ThreadPoolExecutor对象,并传入自定义的ThreadFactory。通过execute方法提交一个任务给线程池执行,任务会由自定义的线程池中的线程来执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值