可以用Java创建各种类型的线程执行器,singleThreadedExecutor
,fixedThreadedExecutor
等。有什么方法可以添加一些东西,这样当我调用getThreadName()
和{{ 1}}在执行的线程上,我可以看到它来自哪个线程执行器?
感谢。
答案 0 :(得分:1)
是。您为这些工厂方法提供了ThreadFactory
实现。这是Thread
来自Runnable
的事情。因此,您可以在方法中执行任何操作,例如设置其名称,优先级或守护程序状态 - 甚至使用自定义Thread
子类。
答案 1 :(得分:1)
如果您使用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;
}
};
答案 2 :(得分:1)
如果您在提交的任务运行时记录线程的名称,那么我建议您使用ThreadGroup
。您也可以使用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();