2017-02-22 6 views
1

だから私は少しのようなコードで働いている:遅いサービスに依存している場合は、プロセッサ時間を費やすのを避けるためにどうすればよいですか?

slowService.callがかかる
public void callSlowService(List<Object> objectsToCallFor) { 
    objectsToCallFor 
     .parallelStream() 
     .forEach(object -> slowService.call(object)) 
} 

〜100-500ms

を問題は、私は私が望むすべてを並列化することができ、ですが、の終わりに私はまだスレッドを500ms待っているだけです。私のCPUには他のスレッドのためにできることがあります。

私はこの他のサービスを変更することはできません(私はできません)と私は私のCPUを解放するいくつかの他のデザインがあります私はslowServiceからの応答を待っている間、

+2

あなたがサービスにアクセスするために電話しているものが健全に書かれていれば、あなたは「プロセッサ時間を費やしていない」*ブロックしています。 – EJP

+0

ええ、私は本当に待っているスレッドについて心配しません。スレッドは軽量(プロセスとは異なります)で、VMチョークの前に数千ものスレッドを持つことができます。 – john16384

答えて

0

できません。

ただし、です。問題を緩和します。 BlockingQueueList<Object> objectsToCallForを入力した新しいスレッドを1つ使用し、到着時に別のキューに結果を送ります。

あなたは結果の所要時間を待っていますが、少なくともメイン処理は継続します。

0

あなたが正しく理解していれば、このメソッドを非同期にしたいと思っています。結果が不要でエラー処理をスキップしたい場合は、新しいスレッドでコードを起動することができます。 ように:

public void callSlowService(final List<Object> objectsToCallFor) { 
    new Thread(() -> { 
     objectsToCallFor 
      .parallelStream() 
      .forEach(object -> slowService.call(object)); 
    }).start(); 
} 

別の(より良い)方法 - のThreadPoolを使用しました。あなたはparallelStream()を使用することに注意してください - >あなたのアプリケーションのパフォーマンスに影響する共有ForkJoinPoolを使用します。古い良いキャッシュされたスレッドプールを使用する方が安全です。または、他のスレッドプール実装はプロジェクトのニーズに依存します。実際に

public ExecutorService executor = Executors.newCachedThreadPool(); 

public void callSlowService(final List<Object> objectsToCallFor) { 
    for (Object obj : objectsToCallFor) { 
     executor.submit(() -> { 
      objectsToCallFor 
       .parallelStream() 
       .forEach(object -> slowService.call(object)); 
     }); 
    } 
} 

、そこに多くの美しい方法で同様の作るためにいくつかの他の方法がありますが、これも動作します必要があります。

関連する問題