Java ExecutorService - 创建一个新线程但不启动它



我在阅读第 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);

对代码的执行没有影响,您可以毫无问题地删除...

执行

器将创建自己的线程以执行代码

您可以通过以下方式验证此行代码是否未生效:

  1. 从代码中删除该行(它将获得相同的结果(
  2. 为线程命名并调试new Thread(this, "T: " + n);您将看到堆栈中没有出现具有此类名称的线程
  3. 你可以检查 ThreadPoolExecutor 的源代码,并验证方法private boolean addWorker(Runnable firstTask, boolean core)是否正在从你作为参数提供的可运行对象创建一个新的工作线程,并且它们这样做

--

w = new Worker(firstTask);
final Thread t = w.thread;

相关内容

  • 没有找到相关文章

最新更新