singleThreadedExecutor
可以在 Java 等中创建各种类型的线程执行器fixedThreadedExecutor
。有什么方法可以添加一些东西,以便当我调用getThreadName()
并getThreadID()
在执行线程上时,我可以看到它来自哪个线程执行器?
谢谢。
singleThreadedExecutor
可以在 Java 等中创建各种类型的线程执行器fixedThreadedExecutor
。有什么方法可以添加一些东西,以便当我调用getThreadName()
并getThreadID()
在执行线程上时,我可以看到它来自哪个线程执行器?
谢谢。
是的。您为这些工厂方法提供一个ThreadFactory
实现。这是一个Thread
由 a 组成的东西Runnable
。因此,您可以在方法中做任何您喜欢的事情,例如设置其名称、优先级或守护程序状态——甚至使用自定义Thread
子类。
如果您使用的是guava,这很简单:
final ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat("Fancy-pool-%02d")
.build();
Executors.newFixedThreadPool(10, threadFactory);
如果你不是一个快乐的guava用户,你可以自己实现它:
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;
}
};
如果您在提交的任务运行时获取线程的名称,那么我建议使用ThreadGroup
. 您也可以使用 a ThreadLocal
,但这听起来更像是 hack。
要使用它,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();