2017-12-26 8 views
0

Ich habe Anforderung, wo müssen die DTOs mit den Werten in FOR-Schleife wie folgt verarbeiten und zuordnen. Jedes der hier verwendeten Mapping-Verfahren benötigt fast 10 Minuten, um seine Geschäftslogik zu vervollständigen und somit eine Leistungsverzögerung zu erzeugen. Ich arbeite daran, die Algorithmen der Geschäftslogik zu verfeinern. Bitte lassen Sie mich jedoch wissen, ob jede dieser Mapping-Methoden parallel verarbeitet werden kann, um die Leistung zu erhöhen.Parallele Verarbeitung von DTO in Java 7

Da Anwendung kompatibel ist nur mit Java 7 ich nicht Ströme von Java verwenden 8.

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

Kann mir bitte jemand sagen, wie dieses Problem gelöst werden kann und ob irgendwelche Designmuster verwendet werden sollten – skanda

+0

Threads - Hier ist ein einfaches Beispiel: https://Stackoverflow.com/a/2531984/3021747 –

Antwort

0

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.

+0

wird dies versuchen. Ich habe diese Logik ausgelöst, wenn aus dem Rest Service API aufgerufen. Ich möchte auch laden die API mit Jmeter für fast 1000 gleichzeitige Anfragen zu testen. Sollte ich hier irgendwelche Änderungen zur Berücksichtigung der Nebenläufigkeit in Betracht ziehen. Bitte beraten Sie – skanda

+0

In diesem Beispiel denke ich, dass actualBlocksize außerhalb für Schleife sein sollte und es sollte als actualBlocksize + = blocksize erhöhen; in for Schleife. Ich sehe, dass dies zu den Ergebnissen führen wird. Bitte helfen Sie mir auch hier, über diese Überlappungslogik Bescheid zu wissen. – skanda

+0

Bitte lassen Sie mich wissen, wenn die Anwendung von Gabel/Join-Konzept irgendwelche Probleme auftreten wird? – skanda

Verwandte Themen