Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中命名线程池中的线程_Java_Multithreading_Threadpool_Executorservice - Fatal编程技术网

如何在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以创建自定义线程工厂,该线程工厂允许您执行以下操作:

  • 具有自定义线程名称
  • 可以选择线程-用户线程或守护进程线程
  • 可以选择线程优先级
  • 具有设置未捕获异常处理程序的灵活性
  • 在下面的文章中,您可以使用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);
                    }
                });
        }
    
    }