2017-08-17 4 views
0

Je me sers de l'interface ExecutorService Multithreading pour exécuter les tâches en parallèle. Mais il y a une ressource partagée ici et j'ai besoin de la faire en synchroniser le bloc afin qu'un seul thread puisse y accéder à la fois. Comme je l'ai fait en bloc de synchronisation, le travail prend plus de 3 heures pour terminer. Je ne vois aucun point d'utiliser Multithreading ici à cause du bloc synchronisé. Quelqu'un peut-il suggérer est-il une alternative ou la meilleure façon de mettre en œuvre l'exemple ci-dessous pour exécuter la boucle plus rapide s'il vous plaît en parallèle:Suggestions alternatives pour MultiThreading

ExecutorService executor = Executors.newFixedThreadPool(100); 
for(String str : arrayList){ 
    for(String str1 : arrayList1){ 
    for(String str2 : arrayList2){ 
     executor.execute(new Runnable() { 
         @Override 
         public void run() { 
          //do Something 
          synchornize block{} 
         } 
     }); 
    } 
    } 
} 

Toutes les suggestions s'il vous plaît?

+0

Je ne sais pas qui a donné un négatif à cette question, mais s'il vous plaît pouvez-vous me faire savoir la raison? pour que je ne le répète pas ici? – user3750720

+0

Pas moi, mais je pense que la réponse dépend du code qui se trouve dans votre bloc exécuteur. Et par curiosité, combien de temps cela prend-il avec un seul fil? –

+0

Donc, fondamentalement, nous allons faire des appels d'API à l'intérieur de la boucle for imbriquée. Donc, vous voulez dire si je lance ceci avec un seul thread au lieu de 100 threads? Il faut pour toujours je crois que je n'ai jamais testé ça..mais si ses 100 threads prennent environ 3 heures ... En fait cela peut prendre 3hours même avec un seul thread car il y a un bloc synchronisé pour la plupart. @SteveSmith – user3750720

Répondre

0

Vous devriez essayer de reconcevoir votre code pour éviter complètement ou minimiser le bloc synchronisé. Par exemple, vous pouvez placer les résultats des appels API sur une file d'attente synchronisée et les traiter par un autre thread.