Frage : ConcurrentLatch in Java.

Ist dieses eine korrekte Implementierung von der gleichzeitigen Verriegelung?

In das below Drehbuch, wünsche ich das isEligibleForClearDown () gleichzeitig laufen gelassen werden. Bitte suggest.

während (iterator! = ungültiges && iterator.hasNext ()) {
abschließendes CountDownLatch startLatch = neues CountDownLatch (Gewinde);
für (int I = 0; I < 10; i++) {
ExecutorService executorService = Executors.newFixedThreadPool (threads); //-Anfang 10 threads.
, wenn (iterator.hasNext ()) {
abschließendes OrderModel Modell = (OrderModel) iterator.next ();
executorService.execute (new jagdbar () {
Öffentlichkeitslücke () {
Kalender jetzt = Calendar.getInstance (TimeZone.getTimeZone („Europe/London"));
, wenn (isEligibleForClearDown (model, master.getCleardownFields () .getClearDownReqFrom (), jetzt)){
, wenn (model.getOrderFields () .hasParentOrderId ()){
//add alle Kindaufträge zum abschließenden result
results.add (Modell);
} sonst {
//add Elternteilaufträge zum Elternteil list
parentOrders.add (Modell);
}
}
startLatch.countDown ();
}
});
} sonst {
wenn (startLatch.getCount () > 0) {//-Verminderungkostenzähler, bis Verriegelung zero.
Versuch ist {
startLatch.await ();
} Fang (InterruptedException e) {
LOGGER.error („unterbrochene Ausnahme bei der Aufwartung der Count-downverriegelung bis end.");
}
}
}
}
Versuch {
startLatch.await (); //-Wartezeit, bis die ersten 10 Gewinde processing.
} Fang abschließen (InterruptedException e) {
LOGGER.error („, unterbrach Ausnahme bei der Aufwartung der Count-downverriegelung bis end.");
}
}

Antwort : ConcurrentLatch in Java.

Erste Sache, die ich mich empfehlen würde, verschiebt Ihren Vollstreckerservice außerhalb der Schleife.  Sie müssen wirklich nur das einmal verursachen.  Abhängig von Ihrer Implementierung können Sie in der Lage sein, es eine Kategorienvariable, irgendeine zu bilden ein Static, der durch alle Fälle dieser Kategorie oder des privaten Mitgliedes geteilt wird, wenn jede Kategorie seine eigene Gewindelache benötigt.  Jede Weise, solange Sie nicht den Service unten schließen, sind Sie in der Lage, jene Gewinde wiederzuverwenden, anstatt, auf die Unkosten von sie jedes Mal beginnen sich zu nehmen.  Wenn mehrfache Anrufe zu dieser Methode gleichzeitig laufen müssen, die Vollstreckerservice-Kreation zurück in die Methode, aber außerhalb der Schleife verschieben.

Sie sieht auch wie Sie herstellt 10 Gewindelachen, mit 10 Gewinden jedes, um jeden Auftrag zu verarbeiten aus.  Code, den ich angebracht habe, wird überarbeitet, um alle zu verarbeiten versah Aufträge mit 10 Gewinden.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
6:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
allgemeine Kategorie ClearDownService {
    private int-Gewinde;
    privates ExecutorService executorService;

    allgemeines ClearDownService (int-Gewinde) {
        wenn (Gewinde < 1="">= 1. „);
        }
        this.threads = Gewinde;
        this.executorService = Executors.newFixedThreadPool (this.threads);
    }

    // I änderte Ihren Wiederholungcode, um anzunehmen, dass Sie irgendeine Ansammlung OrderModel Gegenstände haben
    //, dass Sie pflegen, um das iterator zu erhalten.  Da Sie JDK 1.5+ benutzen, sein viel mehr
    // lesbar und haltbar Generics benutzen, anstatt, die Rückkehr von iterator.next zu werfen ().
    // I änderte auch Ihren Wiederholungcode, um das eingebaute foreach Konstruieren zu benutzen.
    Öffentlichkeit leere checkOrders ( Abholaufträge) {
        // initialisieren Verriegelung für die Gesamtzahl Aufträgen, anstelle von den Gewinden.
        //, das dieses sicherstellt, dass alle Aufträge verarbeitet werden, bevor diese Methode abschließt
        abschließendes CountDownLatch startLatch = neues CountDownLatch (orders.size ());

        //, da Sie JDK 1.5+ benutzen, einfacher, zu lesen und beizubehalten, wenn Sie Generics benutzen
        // und das eingebaute foreach anstelle vom iterator
        für (abschließendes OrderModel Modell: Aufträge) {
            executorService.submit (neues jagdbares () {
                Öffentlichkeitslücke laufen gelassen () {
                    Versuch {
                        Kalender jetzt = Calendar.getInstance (TimeZone.getTimeZone („Europa/London“));
                        wenn (isEligibleForClearDown (Modell, master.getCleardownFields () .getClearDownReqFrom (), jetzt)) {
                            wenn (model.getOrderFields () .hasParentOrderId ()) {
                                // fügen alle Kindaufträge Endergebnis hinzu
                                results.add (Modell);
                            } sonst {
                                // fügen Elternteilaufträge der Elternteilliste hinzu
                                parentOrders.add (Modell);
                            }
                        }
                    } schließlich {
                        //, das dieses in einen schließlich Block einsetzt, stellt sicher, dass er gedankenlos benannt erhält
                        // irgendwelcher Ausnahmen, die im Körper der Methode auftreten
                        startLatch.countDown ();
                    }
                }
            });
        }
        Versuch {
            startLatch.await (); //-Wartezeit für alle Gegenstände zur kompletten Verarbeitung
        } Fang (InterruptedException e) {
            LOGGER.error („unterbrochene Ausnahme bei der Aufwartung der Count-downverriegelung bis end.");
        }
    }
}
Weitere Lösungen  
 
programming4us programming4us