2017-12-26 21 views
0

私は以下のようにDTOをforループの値で処理してマッピングする必要があります。ここでのマッピング方法のそれぞれは、ビジネスロジックを完了するために約10分を消費し、したがってパフォーマンスの遅延を生じさせます。私はビジネスロジックのアルゴリズムを改良するために取り組んでいます。ただし、これらのマッピング方法のそれぞれを並列処理してパフォーマンスを向上させることができるかどうかを教えてください。Java 7でのDTOの並列処理

アプリケーションはJavaだけ7と互換性があるので、私はあなたがRunnableまたはCallableのいずれかを使用して別のスレッドにポートフォリオを分割することができ8.

for(Portfolio pf : portfolio) { 
    mapAddress(pf); 
    mapBusinessUnit(pf); 
    mapRelationShipDetails(pf) 
    -- 
    -- 
    -- 
} 
+0

この問題を解決する方法とデザインパターンを使用する必要がある場合は誰でも教えてください – skanda

+0

スレッド - ここに簡単な例があります:https://stackoverflow.com/a/2531984/3021747 –

答えて

0

のJavaのストリームを使用することはできません。例えば

public class PortfolioService implements Callable<List<Portfolio>> 
{ 
    List<Portfolio> portfolios; 
    public PortfolioService(List<Portfolio> portfolios) 
    { 
     this.portfolios = portfolios; 
    } 


    public List<Portfolio> call() 
    { 
    for(Portfolio pf : portfolios) { 
     mapAddress(pf); 
     mapBusinessUnit(pf); 
     ... 
     } 
    return portfolios; 
    } 
} 

しかし、これはあなたのメインクラスでいくつかの変更を必要とします。私はここでCallableを使用しています。後でこれらのマッピングされたすべてのポートフォリオで何かをしたいのか分からないからです。ただし、スレッドがすべての作業を行い、復帰する必要がない場合は、Runnableを使用してコードを変更します。

1)あなたは、コアのあなたの量を取得する必要があります。

int threads = Runtime.getRuntime().availableProcessors(); 

2)今、あなたは、スレッドごとにワークロードを分割

// determine the average workload per thread 
int blocksize = portfolios.size()/threads; 
// doesn't always get all entries 
int overlap = portfolios.size()%threads; 

3)今後の要素のリストを作成し、ExecutorServiceのを開始します、アレイスライスの古いインデックスのための通知変数を作成する

ExecutorService exs = Executors.newFixedThreadPool(threads); 
List<Future<List<Portfoilio>>> futures = new ArrayList(); 
int oldIndex = 0; 

4)開始スレッド

for(int i = 0; i<threads; i++) 
{ 
    int actualBlocksize = blocksize; 
    if(overlap != 0){ 
    actualBlocksize++; 
    overlap--; 
    } 
    futures.add(exs.submit(new PortfolioService(portfolios.subList(oldIndex,actualBlocksize)); 
    oldIndex = actualBlocksize; 
} 

5)シャットダウンExecutorServiceのとは)それが終了

exs.shutdown(); 
try {exs.awaitTermination(6, TimeUnit.HOURS);} 
catch (InterruptedException e) { } 

6だ待って、あなたがする必要がある/したい場合は、将来に何かをします。

+0

これを試します。私は休憩サービスAPIから呼び出されたときにこのロジックをトリガしました。また、Jmeterを使用してほぼ1000の同時リクエストに対してAPIのテストをロードしたいと考えています。ここでは、並行性に対応するための変更を考慮する必要があります。助けてください – skanda

+0

この例では、私はactualBlocksizeはループの外にあるべきだと思うし、actualBlocksize + = blocksizeとしてインクリメントする必要があります。 in forループ。私はこれが結果を生み出すのを見る。また、この重複ロジックについて私に知らせてください。 – skanda

+0

フォーク/ジョインのコンセプトを適用すると問題が発生するかどうか教えてください。 – skanda