Vraag : ConcurrentLatch in Java.

Is dit een correcte implementatie van Gezamenlijke Klink?

In het onderstaande scenario, wil ik dat isEligibleForClearDown () gelijktijdig worden in werking gesteld. Tevreden suggest.

terwijl (iterator! = ongeldige && iterator.hasNext ()) {
definitieve CountDownLatch startLatch = nieuwe CountDownLatch (draden);
voor (int. i = 0; i < 10; i++) {
ExecutorService executorService = Executors.newFixedThreadPool (threads); // begin 10 threads.
als (iterator.hasNext ()) {model
definitief OrderModel = (OrderModel) iterator.next ();
executorService.execute (new Jaagbaar () {/> openbare in werking gestelde leegte
Kalender
one.getTimeZone („Europe/London“));
als (isEligibleForClearDown (model, master.getCleardownFields () .getClearDownReqFrom (), nu)){
als (model.getOrderFields () .hasParentOrderId ()){
//add alle orden van het Kind aan definitieve result
results.add (model);
} anders {de orden van de
//add ouder aan de ouder list
parentOrders.add (model);
}
}
startLatch.countDown ();
}
});
} anders {
als (startLatch.getCount () > 0) {// de decrementteller tot de klink zero.
is probeert {
startLatch.await (); />} vangst
LOGGER.error („Onderbroken Uitzondering terwijl het wachten op de aftelprocedureklink om te beëindigen. “);
}
}
}
}
probeert {
startLatch.await (); // wacht tot de eerste/>} vangst 10 draden volledige processing.
LOGGER.error („Onderbroken Uitzondering terwijl het wachten op de aftelprocedureklink om te beëindigen. “);
}
}

Antwoord : ConcurrentLatch in Java.

Eerste ding dat ik beweegt uw uitvoerdersdienst buiten de lijn zou adviseren.  U moet werkelijk slechts creëren dat eens.  Afhankelijk van uw implementatie, kunt u tot het een klassenvariabele kunnen maken, of statisch die door alle instanties van deze klasse of een privé lid wordt gedeeld als elke klasse zijn eigen draadpool wenst.  Één van beide manier, zolang u niet de dienst sluit, zal u die draden kunnen opnieuw gebruiken in plaats van het oplopen van de overheadkosten van elke keer de aanvang van hen.  Als de veelvoudige vraag aan deze methode zal moeten gelijktijdig lopen, beweeg de verwezenlijking van de uitvoerdersdienst terug in de methode, maar buiten de lijn.

Het kijkt ook als u cre�ërt 10 draadpools, met 10 draden elk om elke orde te verwerken.  De code die ik wordt herwerkt om allen te verwerken voorzag orden van 10 draden heb vastgemaakt.
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:
openbare klasse ClearDownService {
    privé int.draden;
    privé executorService ExecutorService;

    openbare ClearDownService (int.draden) {
        als (draden < 1="">= 1. „);
        }
        this.threads = draden;
        this.executorService = Executors.newFixedThreadPool (this.threads);
    }

    // ik uw te veronderstellen herhalingscode wijzigde u wat Inzameling van voorwerpen OrderModel hebt
    // dat u gebruikt om iterator te krijgen.  Aangezien u JDK 1.5+ gebruikt, zijn veel meer
    leesbaar en te handhaven // om Generics te gebruiken in plaats van het gieten van de terugkeer van iterator.next ().
    // wijzigde ik ook uw herhalingscode om het ingebouwde foreachconcept te gebruiken.
    openbare nietige checkOrders (de orden van de Inzameling) {
        // initialiseert klink voor het totale aantal orden, in plaats van draden.
        // dit verzekert alle orden worden verwerkt alvorens deze methode voltooit
        definitieve CountDownLatch startLatch = nieuwe CountDownLatch (orders.size ());

        // aangezien u JDK 1.5+ gebruikt, gemakkelijker te lezen en te handhaven als u generics gebruikt
        // en ingebouwde foreach in plaats van iterator
        voor (definitief model OrderModel: orde) {
            executorService.submit (nieuwe Jaagbaar () {
                openbare in werking gestelde leegte () {
                    probeer {
                        Tijdschema nu = Calendar.getInstance (TimeZone.getTimeZone („Europa/Londen“));
                        als (isEligibleForClearDown (model, master.getCleardownFields () .getClearDownReqFrom (), nu)) {
                            als (model.getOrderFields () .hasParentOrderId ()) {
                                // voegt alle orden van het Kind aan eindresultaat toe
                                results.add (model);
                            } anders {
                                // voegt ouderorden aan de ouderlijst toe
                                parentOrders.add (model);
                            }
                        }
                    } tenslotte {
                        // dat dit zet binnen een definitief blok verzekert het achteloos genoemd wordt
                        // van om het even welke uitzonderingen die in het lichaam van de methode voorkomen
                        startLatch.countDown ();
                    }
                }
            });
        }
        probeer {
            startLatch.await (); // wacht op alle voorwerpen om verwerking te voltooien
        } vangst (InterruptedException e) {
            LOGGER.error („Onderbroken Uitzondering terwijl het wachten op de aftelprocedureklink om te beëindigen. “);
        }
    }
}
Andere oplossingen  
 
programming4us programming4us