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

标签 java multithreading executorservice

我在阅读Java 8完整引用一书中的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 构造函数中的最后一行。

MyThread 的构造函数使用

创建 Thread 的对象

new Thread(this)

但是,这个新创建的线程永远不会通过调用 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;

关于Java ExecutorService - 创建一个新线程但不启动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504489/

相关文章:

java - 二叉搜索树对象创建问题

python - 使用线程或 asycore 在 python 中群聊应用程序

c# - 使用 Dispatcher 切换到 UI 线程的正确语法

java - 是否有必要存储缓存线程池?

java - 搜索通用异步 Java 作业执行框架/库

java - 如何为 ScheduledExecutor 服务提供最大时间来继续启动新线程?

Java Swing : how to stop unwanted shift-tab keystroke action

java - 如何在 Java 中将字节大小转换为人类可读的格式?

java - 使用 Tomcat 7 并尝试从 OracleDataSource 对象获取连接时出现 NoClassDefFoundError

ios - 只有一个上下文的核心数据栈用 NSPrivateQueueConcurrencyType 初始化