2016-08-26 21 views
0

私は、以下のように3つのメソッドを並行して呼び出す必要があるサービスメソッドを持っていて、ServiceMethod()をより速く実行します。スレッドプールをNewFixedThreadPoolと共有する方法

public void ServiceMethod() 
{ 
    ExecutorService executorService = Executors.newFixedThreadPool(10); 
    executorService.execute(new Runnable() { 
    public void run() { 
     System.out.println("Asynchronous task"); 
    } 
}); 
executorService.shutdown(); 
} 

また、私は以下のと同時に、多分1000のクライアントによって呼び出されるServiceMethod()が、私のパズルであることを言及したいと思います。

  1. ServiceMethod()を1000回呼び出された場合、我々は1000個の異なるスレッドプールを作成し、それらのそれぞれが10個のスレッドを含んでいますので、万件のスレッドがあるでしょうか?スレッドが再利用されることはありませんか?

  2. にはどうすれば

    static ExecutorService executorService = Executors.newFixedThreadPool(10); 
    

    とクラスレベルに法の適用範囲から

    ExecutorService executorService = Executors.newFixedThreadPool(10); 
    

    を移動した場合については?静的変数で?そして、1000のクライアントのすべてが10のスレッドを共有します。その場合にのみ、スレッドは再利用されますか?

+0

各タスクに対してローカルに10スレッドプールを作成する理由はありません。しかし必ずしも静的である必要はありません。ライフタイムや使用方法によっては、クラスインスタンスに限定することもできます。 – shmosel

+0

実際、ServiceMethod()には10個のメソッドがあります。たぶんタイプミスです – Jason

答えて

1

あなたはそうです。すべての要求に対してExecutorServiceを作成して破棄するのは非常に無駄でスケーラビリティはありません。エグゼキュータをシャットダウンしてリリースするときにスレッドが破棄されるという事実を考慮しても(つまり、同時に10,000スレッドはありません)、要求が到着したときに新しいスレッドを作成して開始するには高価です。

一般的なアプローチは、タスクをサブミットするすべての要求によって使用される適切な数のスレッドを持つ単一の共有エグゼキュータを持つことです。ただし、エグゼキュータは静的である必要はありません。すべてのリクエストを処理するオブジェクトが1つしかない場合は、単純なクラスフィールドにします。

関連する問題