版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/85048563
大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵
之前介绍过java 推荐的线程池和如何自定义线程池
https://mp.csdn.net/postedit/81783309
今天在使用线程池的时候发现线程池名字实在是太丑了
是这样的
pool-1-thread-1 这样不好看也没有什么意义,假如在线程里的子线程执行出错了查看日志的不能看出来哪个线程池,这样就不是很友好。那么怎么给线程池里的线程有意义的命名呢,咱们先了解一下java线程池默认名字是哪里来的,我以
Executors.newCachedThreadPool()为例,其他的都是一样的
发现都是调用Executors.defaultThreadFactory()方法,最终我们会走到Executors的静态内部类DefaultThreadFactory实现的
static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
//namePrefix = pool- + 用当前工厂类创建的第几个线程池 + -thread-
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}
public Thread newThread(Runnable r) {
//这里就是给线程命名的地方 namePrefix+当前线程池的第几个线程
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
至此我们明白了默认的线程名是如何命名的,那么我们怎么自定义的,很简单我比葫芦画瓢就可以了
class NameTheadFactory implements ThreadFactory{
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
NameTheadFactory() {
//默认namePrefix = default-name-pool
this("default-name-pool");
}
NameTheadFactory(String name){
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
//此时namePrefix就是 name + 第几个用这个工厂创建线程池的
this.namePrefix = name +
poolNumber.getAndIncrement();
}
public Thread newThread(Runnable r) {
//此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程
Thread t = new Thread(group, r,
namePrefix + "-thread-"+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) {
final ThreadPoolExecutor zzhTestPool = new ThreadPoolExecutor(15, 60,
5L, TimeUnit.MINUTES,
new LinkedBlockingQueue<Runnable>(500), new NameTheadFactory("zzh-name-pool-"));
for (int i = 0;i < 3;i++){
zzhTestPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"||||----1");
}
});
}
final ThreadPoolExecutor zzhTestPool2 = new ThreadPoolExecutor(15, 60,
5L, TimeUnit.MINUTES,
new LinkedBlockingQueue<Runnable>(500), new NameTheadFactory());
for (int i = 0;i < 3;i++) {
zzhTestPool2.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->||||----1");
}
});
}
zzhTestPool.shutdown();
zzhTestPool2.shutdown();
}
结果
扫描二维码关注公众号,回复:
4547122 查看本文章
zzh-name-pool-1-thread-2-->||||----1
zzh-name-pool-1-thread-3-->||||----1
zzh-name-pool-1-thread-1-->||||----1
pool2-thread-1-->||||----1
pool2-thread-2-->||||----1
pool2-thread-3-->||||----1