Java 向线程执行器添加更多信息?

Java 向线程执行器添加更多信息?,java,multithreading,executorservice,guava,Java,Multithreading,Executorservice,Guava,可以在Java中创建各种类型的线程执行器,singleThreadedExecutor,fixedThreadedExecutor等等。是否可以添加一些内容,以便在执行线程上调用getThreadName()和getThreadID()时,可以看到它来自哪个线程执行器 谢谢。是的。您为这些工厂方法提供了ThreadFactory实现。这是使线程从可运行的变成线程的东西。因此,您可以在该方法中执行任何您喜欢的操作,例如设置其名称、优先级或守护程序状态,甚至可以使用自定义的线程子类。如果您正在使用,

可以在Java中创建各种类型的线程执行器,
singleThreadedExecutor
fixedThreadedExecutor
等等。是否可以添加一些内容,以便在执行线程上调用
getThreadName()
getThreadID()
时,可以看到它来自哪个线程执行器


谢谢。

是的。您为这些工厂方法提供了
ThreadFactory
实现。这是使
线程从
可运行的
变成
线程的东西。因此,您可以在该方法中执行任何您喜欢的操作,例如设置其名称、优先级或守护程序状态,甚至可以使用自定义的
线程
子类。

如果您正在使用,它非常简单:

final ThreadFactory threadFactory = new ThreadFactoryBuilder()
        .setNameFormat("Fancy-pool-%02d")
        .build();
Executors.newFixedThreadPool(10, threadFactory);
如果您不是一个快乐的用户,您可以自己实现它:

final ThreadFactory threadFactory = new ThreadFactory() {
    final AtomicInteger id = new AtomicInteger();

    @Override
    public Thread newThread(Runnable r) {
        final Thread thread = new Thread(r);
        thread.setName("Fancy-pool-" + id.incrementAndGet());
        return thread;
    }
};
另见:

如果您在提交的任务运行时记录线程的名称,那么我建议使用
线程组。您也可以使用
ThreadLocal
,但这听起来更像是一种黑客行为

要使用
ThreadGroup
,您需要将自己的
ThreadFactory
注入执行器

final ThreadGroup threadGroup = new ThreadGroup("someThreadPoolName");
threadPool = Executors.newFixedThreadPool(10, new ThreadFactory() {
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(threadGroup, r);
        return thread;
    }
});
然后线程可以执行以下操作:

String myThreadPollName = Thread.currentThread().getThreadGroup().getName();

相关:你真的需要使用原子整数吗?我不清楚线程工厂是否具有并发访问权限。它只是制造线程,而不是运行线程。是 啊当然,您还需要每次都增加它。@dublintech:我基于Guava和JDK如何实现线程工厂来创建这个示例。还有可能两个线程同时提交一些任务,而线程池突然需要创建两个线程来满足不断增长的需求。可能出现竞争条件。谢谢你的四个关于增加计数器的提示,修正了。