2016-11-06 4 views
0

JavaのExecutorについて知りましたが、私のニーズに合っているかどうかを考えています。私は、タスクが常に追加されるデータベースを持っています。何千もの動的なタスクがある場合にExecutorを使用するには?

  1. I SQLデータベースからすべての行(タスク)をSELECTします。いつでも、100,000、200,3、または0が存在する可能性があります。

  2. 私はすべての例を見るには、このようなものです:

    ExecutorService taskExecutor = Executors.newFixedThreadPool(50); 
    while(...) { 
        taskExecutor.execute(new MyTask()); 
    } 
    

    それは私のシナリオに調整することができる方法? MyTaskのインスタンスを100000インスタンス化するだけでは、1トンのメモリが無駄になります。

  3. 仕上げが完了するまで待つ必要がありますか?最初のものが5秒で終了し、最後のものが終了するまで長い間使われないままになるので、私たちは時間を無駄にするでしょうので、100000のタスクが終了するまで待つことはできません。これを行うには

+0

データベースからすべてのタスクを同時に照会するのはなぜですか?代わりに、作業する容量(1つしかない可能性がある)と同数のタスクを照会し、作業が完了して容量が増えたら再度照会する必要があります。 –

答えて

2

エレガントかつ効率的な方法は、ブライアン・ゲッツ(Github link here)によって、実際に書籍のJava並行処理中に示すようにBoundedExecutor実装を使用することであろう。

良い出発点でも、タスクの戻り値にアクセスしたい場合には、いくつかの変更

  1. を行う必要があるでしょうがGithubのリンクを提供し、実装後、あなたのタスクを実装することを を確認してください代わりにCallable interface Runnableです。
  2. Executorの代わりにExecutorServiceを使用すると、 はより詳細なシャットダウンを実現するので便利です。 機能
  3. エグゼキュータが完全に によってシャットダウンできるメソッドのセットを公開します。これらのシャットダウンコールの実装では、必要に応じて に基底のExecutorService.shutdown()または ExecutorService.shutdownNow()を委任できます。

また、バインドされたエグゼキュータが初期化されるときにこのように構成パラメータとしてバインドを保持するとよいでしょう。並列に安全に実行できるタスクの数がこの構成パラメータから読み取られます。

この構成パラメータは、パフォーマンスやスケールテストに基づいて、アプリケーションのパフォーマンスや基本的なシステムパフォーマンスを低下させることなく最適な境界を特定することができます。

これが役に立ちます。

関連する問題