Java的ThreadPoolExecutor如何使用自定义ThreadFactory?

时间:2012-03-27 06:47:56

标签: java multithreading executor

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”如何被用作跑步者。

此外,我不明白如何为Thread提供自定义的“run”方法 重用(重用的地方 - 如在ThreadPoolExecutor中 - 意味着“它们运行多个Runnable”)。 ThreadPoolExecutor如何重用这些线程来运行多个Runnable(假设Thread类中的“target”Runnable在构造时设置,并且没有setter)。 ThreadPoolExecutor的文档如下:

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

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

2 个答案:

答案 0 :(得分:4)

  

但是在Worker的实现中,我没有看到字段“thread”如何被用作跑步者。

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

  

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

同样,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();
    }
}

答案 1 :(得分:1)

One Runnable可以调用另一个。您传递的Runnable是从线程池队列获取Runnables并运行它们的那个。