Java 向线程执行器添加更多信息?
可以在Java中创建各种类型的线程执行器,Java 向线程执行器添加更多信息?,java,multithreading,executorservice,guava,Java,Multithreading,Executorservice,Guava,可以在Java中创建各种类型的线程执行器,singleThreadedExecutor,fixedThreadedExecutor等等。是否可以添加一些内容,以便在执行线程上调用getThreadName()和getThreadID()时,可以看到它来自哪个线程执行器 谢谢。是的。您为这些工厂方法提供了ThreadFactory实现。这是使线程从可运行的变成线程的东西。因此,您可以在该方法中执行任何您喜欢的操作,例如设置其名称、优先级或守护程序状态,甚至可以使用自定义的线程子类。如果您正在使用,
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如何实现线程工厂来创建这个示例。还有可能两个线程同时提交一些任务,而线程池突然需要创建两个线程来满足不断增长的需求。可能出现竞争条件。谢谢你的四个关于增加计数器的提示,修正了。