我有一个使用Executor
框架的Java应用程序,我的代码看起来像这样
protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)
我的理解是,JVM内部会创建一个包含5个线程的池。现在,当我在分析器中检查执行时,我会得到类似thread-pool2,thread-pool3
等的内容。
Some of these thread pools are created by the server and some are created by me
,我需要一种方法来区分由我创建的以及由服务器创建的。
我在想,如果我可以为线程池命名它应该可以解决问题,但是没有看到任何允许我这样做的API。
提前致谢。
答案 0 :(得分:46)
您可以将自己的ThreadFactory传递给ScheduledThreadPoolExecutor。你的ThreadFactory将创建线程,并可以给它任何你想要的名称。您的ThreadFactory也可以重用Executors.defaultThreadFactory(),并且只在返回线程之前更改名称。
答案 1 :(得分:10)
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);
}
});
}
}
答案 2 :(得分:8)
来自ThreadPoolExecutor documentation:
创建新线程 使用ThreadFactory创建新线程。如果没有另外指定,则使用Executors.defaultThreadFactory(),它创建所有线程都在同一个ThreadGroup中并具有相同的NORM_PRIORITY优先级和非守护进程状态。通过提供不同的ThreadFactory,可以改变线程的名称,线程组,优先级,守护进程状态等。如果ThreadFactory在通过从newThread返回null请求时无法创建线程,执行程序将继续,但可能无法执行任何任务。
答案 3 :(得分:0)
使用您自己的自定义线程工厂。实现ThreadFactoryBuilder以创建自定义线程工厂,允许您执行以下操作:
您可以使用以下帖子中的示例ThreadFactoryBuilder实现。
http://wilddiary.com/understanding-java-threadfactory-creating-custom-thread-factories/