Pytanie : ConcurrentLatch w Jawa.

Być zapadka poprawny urzeczywistnienie Równocześnie Zapadka?

In the biegać scenariusz, I chcieć the isEligibleForClearDown () biegać równocześnie. Zadawalać suggest.

podczas gdy (iterator! = nieobowiązujący && iterator.hasNext ()) {
definitywny CountDownLatch startLatch = nowy CountDownLatch (nić);
dla (int i = (0); i < 10; i++) {
ExecutorService executorService = Executors.newFixedThreadPool (threads); // początek 10 threads.
jeżeli (iterator.hasNext ()) {
definitywny OrderModel model = (OrderModel) iterator.next ();
executorService.execute (new/>ope/London jawny kawitacyjny bieg () {
Kalendarzowy teraz = Calendar.getInstance (TimeZone.getTimeZone ("Europe/London"));
jeżeli (isEligibleForClearDown (model, master.getCleardownFields () .getClearDownReqFrom (), teraz)){
jeżeli (model.getOrderFields () .hasParentOrderId ()){
//add wszystkie Dziecko rozkaz definitywny result
results.add (model);
} inny {
//add mateczny rozkaz the mateczny list
parentOrders.add (model);
}
}
startLatch.countDown ();
}
});
} inny {
jeżeli (startLatch.getCount () > (0)) {// decrement kontuar until zapadka być zero.
próba {
startLatch.await ();
} chwyt (InterruptedException e) {
LOGGER.error ("Przerywać Wyjątek podczas gdy czekać the odliczanie zapadka end.");
}
}
}
}
próba {
startLatch.await (); // czekanie until the pierwszy 10 nić uzupełniać processing.
} chwyt (InterruptedException e) {
LOGGER.error ("Przerywać Wyjątek podczas gdy czekać the odliczanie zapadka end.");
}
}

Odpowiedź : ConcurrentLatch w Jawa.

Pierwszy rzecz I polecać ruszać się twój egzekutor usługa na zewnątrz the pętla.  Ty naprawdę tylko potrzebować naprawdę to.  W zależności od twój urzeczywistnienie, ty móc sprawnie ono klasowy zmienna, lub ładunek elektrostatyczny który dzielić wszystkie przykład ten klasa lub prywatny członek jeżeli ten klasa potrzebować swój swój niciany basen.  Lub sposób, dopóki ty zamykać the usługowy puszek, ty być sprawnie reuse tamte nić zamiast the koszty stałe każdy czas.  Jeżeli wieloskładnikowy wezwanie ten metoda potrzebować równocześnie, ruszać się the egzekutor usługa tworzenie plecy w the metoda, ale na zewnątrz the pętla.

Ono także spojrzenie jak ty tworzyć 10 niciany basen, z 10 nić nić nić rozkaz.  The kod I dołączać przerabiać dołączać wszystko rozkaz z 10 nić.
(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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
społeczeństwo klasowy ClearDownService {
    intymny int nić;
    intymny ExecutorService executorService;

    jawny ClearDownService (int nić) {
        jeżeli (nić < 1="">= 1. ");
        }
        this.threads = nić;
        this.executorService = Executors.newFixedThreadPool (this.threads);
    }

    // I modyfikować twój iteracja kod ty mieć niektóre Kolekcja OrderModel przedmiot
    // że ty używać the iterator.  Ponieważ ty używać JDK 1.5+, swój dużo bardziej
    // iterator.next i iterator.next Generics zamiast the powrót iterator.next ().
    // I także modyfikować twój iteracja kod the obmurowany foreach konstrukcja.
    jawny kawitacyjny checkOrders (Inkasowy rozkaz) {
        // Initialize zapadka dla the sumaryczny liczba rozkaz, zamiast nić.
        // Metoda zapewniać wszystkie rozkaz przetwarzać zanim ten metoda uzupełniać
        definitywny CountDownLatch startLatch = nowy CountDownLatch (orders.size ());

        // ponieważ ty używać JDK 1.5+, łatwy i jeżeli ty używać generics
        // i the obmurowany foreach zamiast the iterator
        dla (definitywny OrderModel model: rozkaz) {
            executorService.submit (nowy Runnable () {
                jawny kawitacyjny bieg () {
                    próba {
                        Kalendarzowy teraz = Calendar.getInstance (TimeZone.getTimeZone ("Europa/Londyn"));
                        jeżeli (isEligibleForClearDown (model, master.getCleardownFields () .getClearDownReqFrom (), teraz)) {
                            jeżeli (model.getOrderFields () .hasParentOrderId ()) {
                                // dodawać wszystkie Dziecko rozkaz rezultat końcowy
                                results.add (model);
                            } inny {
                                // dodawać mateczny rozkaz the mateczny lista
                                parentOrders.add (model);
                            }
                        }
                    } w końcu {
                        // ono w w końcu blokowy zapewniać ono dostawać dzwonić dzwonić
                        // jakaś wyjątek który zdarzać się w the ciało the metoda
                        startLatch.countDown ();
                    }
                }
            });
        }
        próba {
            startLatch.await (); // czekać na wszystkie przedmiot zupełny przerób
        } chwyt (InterruptedException e) {
            LOGGER.error ("Przerywać Wyjątek podczas gdy czekać the odliczanie zapadka end.");
        }
    }
}
Inne rozwiązania  
 
programming4us programming4us