Sie Portfolios verschiedene Threads aufgeteilt könnte entweder Runnable oder Callable verwenden.
Zum Beispiel:
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;
}
}
Dies muss jedoch einige Änderungen in der Hauptklasse. Ich benutze Callable hier, da ich nicht weiß, ob Sie danach mit all diesen gemappten Portfolios etwas machen wollen. Wenn Sie möchten, dass die Threads die gesamte Arbeit ausführen und keine Rückgabe benötigen, verwenden Sie Runnable und ändern Sie den Code.
1) Sie haben Ihre Menge Kerne zu erhalten:
int threads = Runtime.getRuntime().availableProcessors();
2) Nun spalten Sie die Arbeitsbelastung pro Thread
// determine the average workload per thread
int blocksize = portfolios.size()/threads;
// doesn't always get all entries
int overlap = portfolios.size()%threads;
3) Starten Sie eine ExecutorService, eine Liste der künftigen Elementen , Erinnerungs Variable für alten Index der Array slice
ExecutorService exs = Executors.newFixedThreadPool(threads);
List<Future<List<Portfoilio>>> futures = new ArrayList();
int oldIndex = 0;
4) Starten Gewinde machen
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) Herunterfahren des ExecutorService und erwartet es Beendigung
exs.shutdown();
try {exs.awaitTermination(6, TimeUnit.HOURS);}
catch (InterruptedException e) { }
6) etwas mit der Zukunft, wenn Sie/wollen müssen.
Kann mir bitte jemand sagen, wie dieses Problem gelöst werden kann und ob irgendwelche Designmuster verwendet werden sollten – skanda
Threads - Hier ist ein einfaches Beispiel: https://Stackoverflow.com/a/2531984/3021747 –