ExecutorsとForkJoinPool.commonPool()によって作成されたさまざまなExecutorServiceインスタンスは、まったく異なる動作をします。ExecutorServiceインスタンスのスレッドの種類の保証
以下のサンプルプログラム(およびその亜種)を試してみると、 "偽"しか表示されません。 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実装の文書化されていない機能に頼るべきではありません。 – hoaz
@hoaz:まさにこの点です。これは実際に文書化されていませんか?もしそうなら、私は何をすべきですか? –