如何在Java中命名线程池中的线程
我有一个使用如何在Java中命名线程池中的线程,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我有一个使用Executor框架的Java应用程序,我的代码如下所示 protectedscheduledexecutorservice ScheduledExecutorService=newscheduledthreadpoolexecutor(5) 我的理解是JVM将在内部创建一个由5个线程组成的池。现在,当我在探查器中检查执行时,我会得到类似于thread-pool2、thread-pool3等的结果 有些线程池是由服务器创建的,有些是由我创建的,我需要一种方法来区分哪些是由我创建的,哪
Executor
框架的Java应用程序,我的代码如下所示
protectedscheduledexecutorservice ScheduledExecutorService=newscheduledthreadpoolexecutor(5)
我的理解是JVM将在内部创建一个由5个线程组成的池。现在,当我在探查器中检查执行时,我会得到类似于thread-pool2、thread-pool3
等的结果
有些线程池是由服务器创建的,有些是由我创建的
,我需要一种方法来区分哪些是由我创建的,哪些是由服务器创建的
我在想,如果我可以命名线程池,它应该可以做到这一点,但是没有看到任何API允许我这样做
提前谢谢。您可以将自己的信息传递给。您的ThreadFactory将创建线程,并可以给它任何您想要的名称。您的ThreadFactory也可以重复使用,并且只能在返回线程之前更改名称。来自ThreadPoolExecutor: 创建新线程 使用ThreadFactory创建新线程。如果未另行指定,则使用Executors.defaultThreadFactory(),该函数将创建所有线程,使其位于同一线程组中,并具有相同的NORM_优先级和非守护进程状态。通过提供不同的ThreadFactory,您可以更改线程的名称、线程组、优先级、守护程序状态等。如果ThreadFactory在从newThread返回null时无法创建线程,则执行器将继续,但可能无法执行任何任务
使用您自己的定制螺纹工厂。实现ThreadFactoryBuilder以创建自定义线程工厂,该线程工厂允许您执行以下操作:
名为ThreadPoolExecutor的公共类扩展ThreadPoolExecutor{
私有静态最终字符串线程\u NAME\u PATTERN=“%s-%d”;
公共名称线程池执行器(int corePoolSize、int maximumPoolSize、long keepAliveTime、final TimeUnit、,
最终字符串名称(前缀){
超级(corePoolSize、maximumPoolSize、keepAliveTime、unit、new LinkedBlockingQueue(),
新螺纹工厂(){
私有最终AtomicInteger计数器=新的AtomicInteger();
@凌驾
公共线程newThread(可运行的r){
final String threadName=String.format(线程\名称\模式,名称前缀,计数器.incrementAndGet());
返回新线程(r,threadName);
}
});
}
}
如果你已经在使用番石榴,那么它可以让这变得非常简单。@Joachim:哦,非常好。我确实用番石榴,但我错过了那节课。非常感谢。是否为线程池中的线程命名,与命名线程池本身相同?我需要命名线程池,以便可以在探查器中看到该名称:)@Sudarshan:thread pool本身没有名称。只有线程才有名称。分析器向您显示的是线程,而不是池。是的,您刚刚意识到,谢谢:)例如,请参阅
public class NamedThreadPoolExecutor extends ThreadPoolExecutor {
private static final String THREAD_NAME_PATTERN = "%s-%d";
public NamedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, final TimeUnit unit,
final String namePrefix) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>(),
new ThreadFactory() {
private final AtomicInteger counter = new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
final String threadName = String.format(THREAD_NAME_PATTERN, namePrefix, counter.incrementAndGet());
return new Thread(r, threadName);
}
});
}
}