2017-08-01 9 views
0

私は実際にこれを実装するのに苦労しています。私は最近、マルチスレッドを学び、executorサービスを使用してジョブを非同期に実行し始めました。Executorサービスを使用する方法とJava 7で複数の実行可能ファイルを持つ方法

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); 
    } 
    } 
} 

をし、次の私は、リストを反復処理し、その中に1つの以上のリストを作成する必要があります。私はここに状況を持っている

が好きです。

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

ここでループの実行者サービスを利用し、ループを非同期に実行することで実行時間を短縮したいと考えています。しかし、私は試してみましたthat.Iを行うことはできませんよ、次

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); 
    } 
    } 
}); 
} 

私は値が他のループで毎回割り当てる必要があるかのように私を得ることをやるカントたいくつかの変数の最終確認する必要があります次のエラー: " Cannot refer to the non-final local variable gList defined in an enclosing scope"。

このタスクに挑戦するために、両方のループでExecutorサービスを使用する方法をお手伝いできますか?多くの時間を費やしました。私はコンセプトを理解しましたが、実装に問題がありました。

+0

あなたの問題はマルチスレッドに関連していません。匿名クラスのルールです。最終的なローカル変数またはeclosingクラスのインスタンス変数を匿名クラスで使用する必要があります。実行可能な例を投稿してください。なぜそれが最終的にできないのかを理解することは難しいからです。 –

+0

@ J-Alexそれでは、最初の3つのループに対してrunnableを呼び出して、ループを速く完了し、2番目の3つのループに同じものを適用する方法はありますか?これらのループを非同期で完了させるためのエグゼキュータ・サービスの例を提供してください。私はその説明に本当に感謝します。私はこれを達成するのに苦労して集まりつつある。 – MSR

答えて

1

注意すべき重要なことは、あなたが使用されているRunnableを定義するすべての変数がRunnableが最終でなければならないということです。

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); 
        } 
       } 
      } 
     }); 
    } 
} 

あなたが最終的にできません変数を持っていますが、あなたはまだ実行可能内で使用する必要がある場合は、非final変数に等しく設定されている新しいfinal変数を宣言することができます

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

私はこの質問で言及したような複数のforループに対してどのように実行しますか?あなたは同様の例を提供していただけますか? – MSR

+0

'stateId'、' sList'、 'gList'、および' lisA'がどのように/どのように定義されているかを表示できますか?あなたの問題は、匿名クラス内でこれらの最終的でない変数を使用することにあると思います。 –

+0

私は自分の質問を編集しました。あなたはお勧めできますか? – MSR

関連する問題