2017-08-01 5 views
0

J'ai vraiment du mal à implémenter cela. J'ai récemment appris le multithreading et j'ai commencé à utiliser le service d'exécution pour exécuter le travail de manière asynchrone.Comment utiliser le service Executor et avoir plusieurs runnable dans java 7

J'ai une situation ici, comme:

final ArrayList<String> sList = new ArrayList<String>(); 
final ArrayList<String> gList = new ArrayList<String>(); 
final JSONArray stateId = [JSON ARRAY WITH JSON DATA] 
//ExecutorService exec = new FixedThreadPoll(10); 
for(String sId : stateId){ 
    for(String sItem : sList){ 
    for(String gItem: gList){ 
     //do an API call 
     lisA.add(somthing); 
    } 
    } 
} 

et ensuite, je besoin de parcourir la liste et de créer une liste plus à l'intérieur.

for(String a : listA){ 
     for(String sItem : sList){ 
     for(String gItem: gList){ 
      //do an API call 
      lisB.add(somthing); 
     } 
     } 
    } 

Je veux utiliser le service d'exécuteur ici pour les boucles et réduire le temps d'exécution en exécutant la boucle de manière asynchrone. Mais je ne suis pas en mesure de faire that.I ont essayé ce qui suit:

ExecutorService exec = new FixedThreadPoll(10); 
for(String sId : stateId){ 
executor.execute(new Runnable() { 
@Override 
public void run() { 
    for(String sItem : sList){ 
    for(String gItem: gList){ 
     //do an API call 
     lisA.add(somthing); 
    } 
    } 
}); 
} 

Je dois faire une dernière variable qui je ne peux pas le faire comme la valeur doit être attribuée à chaque fois dans la boucle ou bien je reçois l'erreur suivante: " Cannot refer to the non-final local variable gList defined in an enclosing scope".

Quelqu'un peut-il m'aider à utiliser le service Executor dans les deux boucles pour faire face à cette tâche s'il vous plaît.avoir passé beaucoup de temps. J'ai compris le concept mais j'ai du mal à le mettre en place.

+0

Votre problème n'est pas lié au multithreading, c'est la règle des classes anonymus: vous devez utiliser la variable locale finale ou la variable d'instance de la classe eclosing dans les classes anonymus. Veuillez écrire un exemple exécutable, car il est difficile de comprendre pourquoi vous ne pouvez pas le faire final. –

+0

@ J-Alex Alors, comment puis-je appeler runnable pour les trois premières boucles afin de compléter la boucle plus rapidement et appliquer la même chose pour les trois dernières boucles? Pouvez-vous s'il vous plaît fournir un exemple de service d'exécution pour compléter ces boucles de manière asynchrone s'il vous plaît? J'apprécierais vraiment avec l'explication. Je suis en train d'avoir du mal à y parvenir. – MSR

Répondre

1

La chose importante à noter est que toutes les variables que vous définissez en dehors du Runnable qui est utilisé à l'intérieur le Runnable doit être définitive.

public static void main(String... args) throws Exception { 
    final ExecutorService exec = Executors.newFixedThreadPool(10); 
    final ArrayList<String> sList = new ArrayList<String>(); 
    final ArrayList<String> gList = new ArrayList<String>(); 
    final List<String> stateId = new ArrayList<>(); 
    final ArrayList<String> lisA = new ArrayList<>(); 

    for(final String sId : stateId) { 
     exec.execute(new Runnable() { 
      @Override 
      public void run() { 
       for (String sItem : sList) { 
        for (String gItem : gList) { 
         //do an API call 
         lisA.add(sId); 
        } 
       } 
      } 
     }); 
    } 
} 

Si vous avez une variable qui ne peut pas être définitive, mais vous avez encore besoin de l'utiliser dans votre runnable, vous pouvez déclarer une nouvelle variable finale qui est égale à la variable non-finale:

public static void main(String... args) throws Exception { 
    final ExecutorService exec = Executors.newFixedThreadPool(10); 
    final ArrayList<String> sList = new ArrayList<String>(); 
    final ArrayList<String> gList = new ArrayList<String>(); 
    final List<String> stateId = new ArrayList<>(); 
    final ArrayList<String> lisA = new ArrayList<>(); 

    // sId is non-final 
    for(String sId : stateId) { 
     // f_sId is final; it will be sId's current value 
     final String f_sId = sId; 
     exec.execute(new Runnable() { 
      @Override 
      public void run() { 
       for (String sItem : sList) { 
        for (String gItem : gList) { 
         //do an API call 
         lisA.add(f_sId); 
        } 
       } 
      } 
     }); 
    } 
} 
+0

Comment l'exécuter pour plusieurs boucles comme pour ce que j'ai mentionné dans la question. Pouvez-vous s'il vous plaît fournir un exemple similaire? – MSR

+0

Pouvez-vous montrer comment/où 'stateId',' sList', 'gList' et' lisA' sont définis? Je crois que votre problème est en utilisant ces variables non-finales dans une classe anonyme. –

+0

J'ai modifié ma question. Pouvez-vous s'il vous plaît suggérer? – MSR