1

singleThreadedExecutor可以在 Java 等中创建各种类型的线程执行器fixedThreadedExecutor。有什么方法可以添加一些东西,以便当我调用getThreadName()getThreadID()在执行线程上时,我可以看到它来自哪个线程执行器?

谢谢。

4

3 回答 3

1

是的。您为这些工厂方法提供一个ThreadFactory实现。这是一个Thread由 a 组成的东西Runnable。因此,您可以在方法中做任何您喜欢的事情,例如设置其名称、优先级或守护程序状态——甚至使用自定义Thread子类。

于 2012-10-24T20:25:02.647 回答
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;
    }
};

也可以看看:

于 2012-10-24T20:25:05.520 回答
1

如果您在提交的任务运行时获取线程的名称,那么我建议使用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();
于 2012-10-24T20:25:27.030 回答