0

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 提供可重用的自定义“运行”方法(重用的地方 - 如 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 创建的线程的“运行”方法?这是我理解“自定义线程创建+线程'重用'”机制的唯一方法。

4

2 回答 2

4

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

正如 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();
    }
}
于 2012-03-27T07:13:00.637 回答
1

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

于 2012-03-27T07:14:13.730 回答