【问题标题】:task id as thread name in thread pool任务 id 作为线程池中的线程名称
【发布时间】:2012-08-11 11:17:43
【问题描述】:

我需要从线程池创建一个线程,并且需要传递一个 task id - 保存在我的 Runnable 对象中的唯一 id - 作为线程名称。

我查看了ThreadFactory 接口,但我无法将任何附加参数作为线程名称传递给创建的线程。另外,我查看了DefaultThreadFactory 类。它使用AtomicInteger 来设置线程名称。

我可以将任意字符串传递给工厂并让它使用该字符串作为创建的线程的名称吗?

【问题讨论】:

  • 创建的Threads 不是用于任务本身;他们是为工人准备的。

标签: java multithreading threadpool


【解决方案1】:

我认为在线程池中调度的每个线程上手动设置 taskId 并不是最优雅的方法。 你可以像这样实现 ThreadFactory 接口 -

public class NamedThreadFactory implements ThreadFactory{
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        if (r instanceof NamedRunnable) {
            NamedRunnable namedRunnable = (NamedRunnable)r;
            t.setName(namedRunnable.getTaskName());
        }
        return t;
    }
}

而你的 NamedRunnable 将是这样的 -

public interface NamedRunnable extends Runnable{
    String getTaskName();
}

【讨论】:

    【解决方案2】:

    您可以将执行任务的线程的名称设置为:

    class YourTask implements Runnable {
      public void run() {
        Thread.currentThread().setName(getTaskId());
        //.. rest of the code for the task
      }
    }
    

    这可能就是你想要的。由线程池创建的线程可能用于执行许多不同的任务 - 因此给线程命名取决于它最终将运行的任务是不可能的。

    【讨论】:

    • 是的,这不可能不是因为开发人员的懒惰,而是因为这是一个坏主意。让我换个说法:坏主意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2012-09-03
    • 2010-12-18
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多