Question : ConcurrentLatch dans Java.

Est-ce que c'une exécution correcte est de verrou concourant ? le

In le scénario ci-dessous, je veux que l'isEligibleForClearDown () soit couru simultanément. Svp suggest.

tandis que (iterator ! = && nul iterator.hasNext ()) {startLatch final de
CountDownLatch = nouveau CountDownLatch (fils) ;
pour (international i = 0 ; i < 10 ; i++) {executorService de
ExecutorService = Executors.newFixedThreadPool (threads) ; début 10 threads.
de // si (iterator.hasNext ()) {modèle final de
OrderModel = (OrderModel) iterator.next () ;
executorService.execute (new praticable () {vide de public de
fonctionnent () {calendrier de
maintenant = Calendar.getInstance (TimeZone.getTimeZone (« Europe/London")) ;
si (isEligibleForClearDown (model, master.getCleardownFields () .getClearDownReqFrom (), maintenant)){
si (model.getOrderFields () .hasParentOrderId ()){
//add tous les ordres d'enfant à result
results.add (modèle) ;
} autrement {ordres de parent de
//add au list
parentOrders.add (modèle) de parent ;
startLatch.countDown du
du
}} () ;
du
}}) ;
} autrement {
si (startLatch.getCount () > 0) {compteur de décroissance de // jusqu'à ce que le verrou soit essai de zero.
{
startLatch.await () ; crochet du
} (InterruptedException e) {
LOGGER.error (« exception interrompue tout en attendant le verrou de compte à rebours à end.") ; essai du
du
du
du
du
}}}} {
startLatch.await () ; l'attente de // jusqu'à ce que les 10 premiers fils accomplissent le crochet de processing.
} (InterruptedException e) {
LOGGER.error (« a interrompu l'exception tout en attendant le verrou de compte à rebours à end.") ;
}
du
} class= de

Réponse : ConcurrentLatch dans Java.

La première chose que je recommanderais déplace votre service d'exécuteur en dehors de de la boucle.  Vous devez vraiment seulement créer cela une fois.  Selon votre exécution, vous pouvez pouvoir lui faire une variable de classe, l'une ou l'autre une charge statique qui est partagée par tous les exemples de cette classe ou d'un membre privé si chaque classe a besoin de sa propre piscine de fil.  L'une ou l'autre manière, tant que vous ne fermez pas le service, vous pourrez réutiliser ces fils au lieu d'encourir les frais généraux de les commencer chaque fois.  Si les appels multiples à cette méthode devront fonctionner simultanément, déplacer la création de service d'exécuteur de nouveau dans la méthode, mais en dehors de de la boucle.

Elle ressemble également à vous créent 10 piscines de fil, avec 10 fils chacun pour traiter chaque ordre.  Tout le code que j'ai attaché est retouché pour traiter a fourni à des ordres 10 fils.
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 :
classe publique ClearDownService {
    fils privés d'international ;
    executorService privé d'ExecutorService ;

    ClearDownService public (fils d'international) {
        si (fils < 1="">= 1. « ) ;
        }
        this.threads = fils ;
        this.executorService = Executors.newFixedThreadPool (this.threads) ;
    }

    // I a modifié votre code d'itération pour supposer que vous avez une certaine collection d'objets d'OrderModel
    // que vous employez pour obtenir l'iterator.  Puisque vous employez JDK 1.5+, son beaucoup plus
    // lisible et maintenable pour employer des médicaments génériques au lieu de mouler le retour d'iterator.next ().
    // I a également modifié votre code d'itération pour employer la construction intégrée de foreach.
    checkOrders vides de public (ordres de collection) {
        // initialisent le verrou pour tout le nombre d'ordres, au lieu des fils.
        // que ceci s'assure que tous les ordres sont traités avant que cette méthode accomplisse
        startLatch final de CountDownLatch = nouveau CountDownLatch (orders.size ());

        // puisque vous employez JDK 1.5+, plus facile de lire et maintenir si vous employez des médicaments génériques
        // et le foreach intégré au lieu de l'iterator
        pour (modèle final d'OrderModel : ordres) {
            executorService.submit (nouveau praticable () {
                vide de public couru () {
                    essai {
                        Calendrier maintenant = Calendar.getInstance (TimeZone.getTimeZone (la « Europe/Londres »));
                        si (isEligibleForClearDown (modèle, master.getCleardownFields () .getClearDownReqFrom (), maintenant)) {
                            si (model.getOrderFields () .hasParentOrderId ()) {
                                // ajoutent tous les ordres d'enfant au résultat final
                                results.add (modèle) ;
                            } autrement {
                                // ajoutent des ordres de parent à la liste de parent
                                parentOrders.add (modèle) ;
                            }
                        }
                    } finalement {
                        // mettant ceci dans finalement un bloc s'assure qu'il obtient appelé sans se soucier
                        // de toutes exceptions qui se produisent dans le corps de la méthode
                        startLatch.countDown () ;
                    }
                }
            }) ;
        }
        essai {
            startLatch.await () ; attente de // tous les objets au traitement complet
        } crochet (InterruptedException e) {
            LOGGER.error (« exception interrompue tout en attendant le verrou de compte à rebours à end.") ;
        }
    }
}
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us