【问题标题】:How Java's ThreadPoolExecutor uses custom ThreadFactory?Java的ThreadPoolExecutor如何使用自定义的ThreadFactory?
【发布时间】:2012-03-27 06:47:56
【问题描述】:

ThreadPoolExecutor 类允许提供一个自定义的 ThreadFactory 来创建新线程。但是,我不明白这些线程是如何在 sun 的 ThreadPoolExecutor 实现中使用的。

这个实现创建新线程如下:

private Thread addThread(Runnable firstTask) {
    Worker w = new Worker(firstTask);
    Thread t = threadFactory.newThread(w);
    if (t != null) {
        w.thread = t;
    ...
    } ...

但是在Worker的实现中,我看不到“线程”字段是如何用作运行器的。

此外,我不明白如何为 Thread 提供自定义“运行”方法 被重用(在重用的地方 - 如在 ThreadPoolExecutor 中 - 表示“它们运行多个 Runnable”)。 ThreadPoolExecutor 如何重用这样的线程来运行多个 Runnable(假设 Thread 类中的“目标”Runnable 是在构造时设置的并且没有设置器)。 ThreadPoolExecutor的文档如下:

 By supplying a different ThreadFactory, you can alter the thread's name, thread group, priority, daemon status, etc.

这是否意味着不使用自定义 ThreadFactory 创建的线程的“运行”方法?这是我理解“自定义线程创建+线程'重用'”机制的唯一方法。

【问题讨论】:

    标签: java multithreading executor


    【解决方案1】:

    但是在Worker的实现中,我看不到“线程”字段是如何用作运行器的。

    正如 newThread() 文档所述,新创建的线程必须运行作为参数提供给 threadFactory.newThread(Runnuble) 的 Runnuble。 这是使用新线程作为运行器的方式。

    此外,我不明白如何为 Thread 提供可重用的自定义“运行”方法

    同样,线程的 run 方法必须运行一次提供的 Runnable.run()。线程轮询提供了在循环中运行任务的 Worker。 正确的用户实现线程示例:

    public class ThreadTL extends Thread {
        public ThreadTL(Runnable r) {
            super(r);
            setName(getName()+" DF "+executor.getClass().getSimpleName());
        }
    
        @Override
        public void run() {
            super.run();
        }
    }
    

    【讨论】:

    • 好吧,Worker 由自定义线程自己运行。我被“工人”这个名字误导了,它更像是一个仆人。因此,因为“目标”在 Thread 中是私有的,自定义实现没有其他选择,只能在自己的 run() 方法中调用 super.run()。谢谢。
    【解决方案2】:

    一个 Runnable 可以调用另一个。您获得的 Runnable 是从线程池队列中获取 Runnables 并运行它们的一种。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2010-10-22
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多