java自定义线程池名称(给线程池自定义名称)

原文链接:java自定义线程池名称_zquwei的博客-CSDN博客_java 线程池命名

背景:工作中有时候需要自定义线程池名称,以便于更好地定位问题 

查看线程池核心类分析下:ThreadPoolExecutor

  • 线程池执行时会添加工作线程:

//如例子代码:
ExecutorService executorService =new ThreadPoolExecutor(5,5,1,
                TimeUnit.MINUTES,new LinkedBlockingDeque<>(),new NamedThreadFactory("测试"));//Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            executorService.execute(new AppTest2());
        }
        executorService.shutdown();
//1进去
 executorService.execute(new AppTest2());
//2 再跳到
addWorker(command, true)
//3 看下new Worker(firstTask);构造函数
Worker(Runnable firstTask) {
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }
//4发觉创建名字在getThreadFactory().newThread(this);中,查看其构造函数:

DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() +
                         "-thread-";
        }
 

所以最后很显然,新建线程池时new ThreadPoolExecutor()的7个参数中 ,ThreadFactory threadFactory参数就是负责给线程池命名。

看到 ThreadFactory是一个接口,不难发现只要实现这个接口,把入参ThreadFactory改为自定义的实现类 就能自定义线程池名称。所以最后代码为:

public class AppTest2 implements Runnable{

    static class NamedThreadFactory  implements ThreadFactory {
        private final AtomicInteger poolNumber = new AtomicInteger(1);

        private final ThreadGroup threadGroup;

        private final AtomicInteger threadNumber = new AtomicInteger(1);

        public  final String namePrefix;
        NamedThreadFactory(String name){
            SecurityManager s = System.getSecurityManager();
            threadGroup = (s != null) ? s.getThreadGroup() :
                    Thread.currentThread().getThreadGroup();
            if (null==name || "".equals(name.trim())){
                name = "pool";
            }
            namePrefix = name +"-"+
                    poolNumber.getAndIncrement() +
                    "-thread-";
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(threadGroup, r,
                    namePrefix + threadNumber.getAndIncrement(),
                    0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }

    public static void main(String[] args) {
        ExecutorService executorService =new ThreadPoolExecutor(5,5,1,
                TimeUnit.MINUTES,new LinkedBlockingDeque<>()
                ,new NamedThreadFactory("测试"));
        for (int i = 0; i < 10; i++) {
            executorService.execute(new AppTest2());
        }
        executorService.shutdown();
    }

    @Override
    public void run() {
         System.out.println(Thread.currentThread().getName());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

spring也为我们提供了自定义线程池的工具类:CustomizableThreadFactory,可以直接使用: 

 ThreadFactory springThreadFactory = new CustomizableThreadFactory("测试-pool-");
        ExecutorService executorService =new ThreadPoolExecutor(5,5,1,
                TimeUnit.MINUTES,new LinkedBlockingDeque<>(), springThreadFactory );
        for (int i = 0; i < 10; i++) {
            executorService.execute(new Test());
        }
        executorService.shutdown();

除此以外还有

  • Google guava 工具类 提供的 ThreadFactoryBuilder ,使用链式方法创建。
  • Apache commons-lang3 提供的 BasicThreadFactory

__________________________________

我自己写的线程池工具使用例子

package com.dllg56.app.application.util;

import io.micrometer.core.instrument.util.NamedThreadFactory;
import org.apache.poi.ss.formula.functions.Na;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.Date;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author zhaoyong
 * @Date 2021/4/27
 * @Description 线程池工具
 */
public class ThreadPoolUtil {
//--------------2022-07-12线程池暂时关闭------------start

   private static final ThreadPoolExecutor threadPoolExecutor =  new ThreadPoolExecutor(

        10, 16, 50000L, TimeUnit.MILLISECONDS,

        new LinkedBlockingQueue<Runnable>( ),new CustomizableThreadFactory("任务处理线程池--线程"));
    //--------------2022-07-12线程池暂时关闭------------end
//--------------2022-07-12线程池暂时 停用------------start
//private static final ThreadPoolExecutor threadPoolExecutor =null;
//--------------2022-07-12线程池暂时 停用------------end

    public static ThreadPoolExecutor getThreadPoolExecutor() {
        return threadPoolExecutor;
    }

    public static int getWorkingTheadCount(){
       return (int)threadPoolExecutor.getTaskCount();
    }

/*   public static void main(String[] args){

        for(int i =0 ;i<100;i++){
            getThreadPoolExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(System.currentTimeMillis());
                }
            });
        }

    }*/
}

 

————————————————
版权声明:本文为CSDN博主「zquwei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zquwei/article/details/122939409

Java中可以通过自定义线程池来管理线程的执行。可以使用@Async注解来指定线程池,如在@Component注解中使用@Async("taskExecutor")来指定线程池名称为"taskExecutor"。\[1\]另外,还可以通过实现Callable接口并重写call()方法,然后使用FutureTask来获取线程的执行结果。\[2\]在线程池的使用方面,可以使用ExecutorService接口来创建线程池,例如使用Executors.newFixedThreadPool(3)来创建一个固定大小为3的线程池。\[3\]最后,记得在使用完线程池后调用shutdown()方法来关闭线程池。 #### 引用[.reference_title] - *1* [java自定义线程池总结](https://blog.csdn.net/qq_21225505/article/details/125092169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java自定义线程池](https://blog.csdn.net/HcJsJqJSSM/article/details/123033019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java创建线程池三种方式及自定义线程池](https://blog.csdn.net/Luck_ZZ/article/details/101057124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值