gpt4 book ai didi

java - ExecutorService 实例的线程类型保证

转载 作者:行者123 更新时间:2023-12-01 10:03:49 25 4
gpt4 key购买 nike

各种ExecutorServiceExecutors 创建的实例和 ForkJoinPool.commonPool()当然有完全不同的行为。

如果您尝试下面的示例程序(及其变体),您应该会看到它只打印“false”。由于服务使用daemon threads当主线程死亡时,这当然是可以预料的。但除了源代码之外,我在任何地方都找不到这种行为的记录,那么我如何确定这种情况将来不会改变?

如果我无法确定在创建这样的 ExecutorService 实例时是否会使用守护线程,我应该如何以保证我想要的行为的方式创建它们?

import java.util.concurrent.*;

class ExecutorsTest {
public static void main(String[] args) {
// These use normal threads
// ExecutorService es = Executors.newSingleThreadExecutor();
// ExecutorService es = Executors.newCachedThreadPool();

// These use daemon threads
ExecutorService es = Executors.newWorkStealingPool();
// ExecutorService es = ForkJoinPool.commonPool();

es.execute(() -> {
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().isDaemon());
});
}
}

最佳答案

您不应依赖特定 JRE/JDK 实现的未记录功能。

如果你想确保线程是守护进程或者有特定的线程名称,你可以使用ThreadFactory API来构造它们:

Executors.newFixedThreadPool(int nThreads, ThreadFactory threadFactory)

由于某种原因,Executors API 中没有接受 ThreadFactoryWorkStealingPool 的相应方法。

关于java - ExecutorService 实例的线程类型保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36607625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com