向Thread Executors添加更多信息?

时间:2012-10-24 20:20:55

标签: java multithreading executorservice

可以用Java创建各种类型的线程执行器,singleThreadedExecutorfixedThreadedExecutor等。有什么方法可以添加一些东西,这样当我调用getThreadName()和{{ 1}}在执行的线程上,我可以看到它来自哪个线程执行器?

感谢。

3 个答案:

答案 0 :(得分:1)

是。您为这些工厂方法提供了ThreadFactory实现。这是Thread来自Runnable的事情。因此,您可以在方法中执行任何操作,例如设置其名称,优先级或守护程序状态 - 甚至使用自定义Thread子类。

答案 1 :(得分:1)

如果您使用,则非常简单:

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;
    }
};

另见:

答案 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();