0

ExecutorsForkJoinPool.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()); 
     }); 
    } 
} 
+0

特定のJRE/JDK実装の文書化されていない機能に頼るべきではありません。 – hoaz

+0

@hoaz:まさにこの点です。これは実際に文書化されていませんか?もしそうなら、私は何をすべきですか? –

答えて

1

特定のJRE/JDK実装の文書化されていない機能には依存しないでください。

あなたはスレッドがデーモンであるか、特定のスレッドの名前を持っていることを確認したい場合は、あなたがそれらを構築するためにThreadFactory APIを使用することができます。

Executors.newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 

何らかの理由で受け入れWorkStealingPoolためのエグゼキューAPIには、対応付け方法はありませんThreadFactory