の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だ待って、あなたがする必要がある/したい場合は、将来に何かをします。
この問題を解決する方法とデザインパターンを使用する必要がある場合は誰でも教えてください – skanda
スレッド - ここに簡単な例があります:https://stackoverflow.com/a/2531984/3021747 –