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”方法?这是我理解“自定义线程创建+线程'重用'”机制的唯一方法。
答案 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并运行它们的那个。