2017-01-02 12 views
0

ExecutorServiceとFuturesのリストを使用してJavaでスレッドプールを作成しました。 私は、Callableインターフェイスを実装するRandomProcessクラスを作成し、呼び出しメソッド をオーバーライドして特定の操作を実行しました。実行時にExecutorService経由でスレッドに加えられた変更が反映されない

それは次のようになります。

public class RandomProcess implements Callable<Integer> { 
private Result result; 

public RandomProcess(Result result) { 
    super(); 
    this.result = result; 
} 

@Override 
    public Integer call() throws Exception { 
    //performSomeOps returns a Result that has certain values that I need 
    result = performSomeOps(); 
    return 1; 
} 

私はRandomprocessスレッドで を加えられた変更を反映することになって、このクラスでは、この結果オブジェクトを持っています。残念ながら、私はこの結果を返すとき、変更は反映されません。

public class Abc{ 
    public Result check(){ 
     Result result = new Result(true); 
     try { 
       ExecutorService exec = Executors.newFixedThreadPool(7); 
       List<Future<?>> futures = new ArrayList<Future<?>>(7); 
       for (Entity entity : randomListOfEntities) { 
        futures.add(exec.submit(new RandomProcess(result))); 
       } 
       for (Future<?> f : futures) { 
        f.get(); // wait for a process to complete 
       } 
       exec.shutdown(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
} 

問題の原因を特定できません。

+1

なぜそれが何かを反映する必要がありますか?何も追加/変更していない 'result'への内部参照のみをオーバーライドしています。 –

+0

こんにちは@M.Deinumあなたはどのように結果で行われた変更を取り戻すことができますので、私はそれらをチェックメソッドに持っていますか教えてください。 Thnx –

+0

**いつも1を返す代わりに**結果を返すのはどうですか? f.get()はこの結果も返します。 –

答えて

1

を実装= performSomeOps()。 スレッドの送信中に渡された結果の値は更新されません。元のオブジェクトを変更するのではなく、その行に新しいオブジェクトを割り当てるだけです。結果オブジェクト内の値(Something link result.setSomevalue()= performSomeOps()。getSomeValue())を更新するか、結果オブジェクトをperformSomeOps()に渡して、そのメソッド内の結果を更新する必要があります。

+0

ありがとう@Bikasそれは働いた。 –

+0

嬉しいことに... –

0

"Result"を "RandomProcess"スレッドのオブジェクトとして返す必要があります。変更が反映されます。

パブリッククラスRandomProcessラインの結果で呼び出し可能 {

private Result result; 

public RandomProcess(Result result) { 
    super(); 
    this.result = result; 
} 

@Override 
public Result call() throws Exception { 
    result = performSomeOps(); 
     return result; 
} 

}

関連する問題