我在阅读第 Java 8 The complete reference
本书ExecutorService
部分时遇到了下面的代码片段。
下面的代码片段解释了ExecutorService
的工作原理。
// A simple example that uses an Executor.
import java.util.concurrent.*;
class SimpExec {
public static void main(String args[]) {
CountDownLatch cdl = new CountDownLatch(5);
CountDownLatch cdl2 = new CountDownLatch(5);
CountDownLatch cdl3 = new CountDownLatch(5);
CountDownLatch cdl4 = new CountDownLatch(5);
ExecutorService es = Executors.newFixedThreadPool(2);
System.out.println("Starting");
// Start the threads.
es.execute(new MyThread(cdl, "A"));
es.execute(new MyThread(cdl2, "B"));
es.execute(new MyThread(cdl3, "C"));
es.execute(new MyThread(cdl4, "D"));
try {
cdl.await();
cdl2.await();
cdl3.await();
cdl4.await();
} catch (InterruptedException exc) {
System.out.println(exc);
}
es.shutdown();
System.out.println("Done");
}
}
class MyThread implements Runnable {
String name;
CountDownLatch latch;
MyThread(CountDownLatch c, String n) {
latch = c;
name = n;
new Thread(this);
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + ": " + i);
latch.countDown();
}
}
}
我无法理解的是类 MyThread
构造函数的最后一行。
Thread
MyThread
的构造函数
新线程(此(
但是,这个新创建的线程永远不会通过调用start()
方法来启动。此外,根据我的理解,ExecutorService
创建和管理自己的线程来运行我们的runnable
任务。那么为什么在这种情况下创建这个Thread
对象呢?
这一行:
new Thread(this);
对代码的执行没有影响,您可以毫无问题地删除...
执行器将创建自己的线程以执行代码
您可以通过以下方式验证此行代码是否未生效:
- 从代码中删除该行(它将获得相同的结果(
- 为线程命名并调试
new Thread(this, "T: " + n);
您将看到堆栈中没有出现具有此类名称的线程 - 你可以检查 ThreadPoolExecutor 的源代码,并验证方法
private boolean addWorker(Runnable firstTask, boolean core)
是否正在从你作为参数提供的可运行对象创建一个新的工作线程,并且它们这样做
--
w = new Worker(firstTask);
final Thread t = w.thread;