2017-03-01 9 views
0

私はJava 8固定スレッドプールのコードを見ています。Java 8固定スレッドプールは常に固定数のスレッドを作成しますか?

ExecutorService service = Executors.newFixedThreadPool(100); 

    try { 

     for (int i = 0; i < 10; ++i) { 
      service.submit(() -> "In another thread!"); 
     } 

    } catch (Exception e) { 
     // Do nothing 
    } finally { 
     service.shutdown(); 
    } 

私が持っている質問は(二つの部分)である:

ここに小さなサンプルです。上記の固定スレッドプールオブジェクトは何スレッド作成されますか? 100?それとも10?

b。作成されたスレッドの数を確認するにはどうすればよいですか?

答えて

2

上記の固定スレッドプールオブジェクトはいくつのスレッドを作成しますか? 100?それとも10?

これは指定されていません。指定されているのは、決して100を超えないことです。

作成されたスレッドの数を確認するにはどうすればよいですか?

APIはありません。前後の合計スレッド数を取得することはできますが、Javaにスレッドを作成する他の理由があるため、それはあいまいかもしれません。

+0

ありがとうございます!私の質問に答えられたように見えます。 –

0

以下は、ExecutorService,Callable、およびFutureクラスを学習するときの熟語として使用した2つの単純なクラスです。

あなたは私がサイズ2のスレッドプールを使用して、私が処理する必要がある10個のアイテムを持っていることがわかります。基本的には、スレッドプールを作成し、Callableを実装するクラスを渡し、結果としてFutureを処理の証明として使用します。サイズ2のスレッドプールがある場合、一度に処理できるアイテムは2つだけです。結果を表示するには、値を変更できます。

Main.java:

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class Main { 

    public static void main(String[] args) { 
     ExecutorService executorService = Executors.newFixedThreadPool(2); 

     List<Future<String>> lst = new ArrayList<Future<String>>(); 

     for (int i = 0; i < 10; ++i) { 
      Callable<String> callable = new Calling(); 
      Future<String> future = executorService.submit(callable); 
      lst.add(future); 
     } 

     int futureCount = 0; 
     for (Future<String> fut : lst) { 
      try { 
       futureCount++; 
       System.out.println("Processed call() in thread " + fut.get() + ", future number: " + futureCount); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     executorService.shutdown(); 
     while (!executorService.isTerminated()) { 
      // wait, basically 
     } 

     System.out.println("Finished all threads!"); 

    } 
} 

Calling.java

import java.util.concurrent.Callable; 

public class Calling implements Callable<String> { 

    public Calling() { 
    } 

    public String call() throws InterruptedException { 
     System.out.println("Sleeping thread: " + Thread.currentThread().getName()); 
     Thread.sleep(2000); 
     return Thread.currentThread().getName(); 
    } 

} 
+0

私の答えをdownvoteするつもりなら、理由を説明してください。私の答えがOPを教育するのに役立つ貴重な文脈を提供しない理由はない。 – corneria

0

executorがアプリケーションコードで基礎となるスレッドをスピンアップする方法についての仮定をしないでください。あなたの好奇心を満たすだけです:

上記の固定スレッドプールオブジェクトはいくつのスレッドを作成しますか? 100?それとも10?

デフォルトではThreadFactoryが使用されていますが、固定スレッドプールは完全にスレッドを遅延させます。もちろん、別途記載されていない限り、後続のJDKではこれが変更される可能性があります。 @EJPによると、頼りになる不変の唯一のものは100個以下です。

どのようにして作成されたどのように多くのスレッドを確認できますか?

は、特定のエグゼキュータ専用のスレッドを取得する方法はありませんが、JVM内部からすべてのライブスレッドのコールスタックのマップを取得するためにThread#getAllStackTracesを使用することができます。またVisualVMのようないくつかのツールを使用します。

関連する問題