保证ExecutorService实例的线程类型

时间:2016-04-13 19:17:05

标签: java multithreading concurrency executorservice java-threads

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());
        });
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

Executors.newFixedThreadPool(int nThreads, ThreadFactory threadFactory)

由于某些原因,WorkStealingPool的Executors API中没有相应的方法接受ThreadFactory