2016-08-16 13 views
-1

私の設定は以下の通りです。私が達成したいのは、実装された各クラスのaMethodを並行して実行することです。私はFutureRunnableを使用して調べましたが、いずれの処理を続行するかわかりません。異なるスレッドで同時にオブジェクト内のメソッドを実行する方法はありますか?

最初の考えは、booleanの代わりにFuture<Boolean>を返そうとしていましたが、最初に呼び出された名前に結果をどのように関連付けるのかはわかりません。

aMethodを並列/非同期で実行する理由は、aMethodがhttp要求を持つ可能性があるためです。リクエストがある場合、私は返事が続くのを待っていません。私はそれを別のスレッドで行い、次の方法に進むことを望みます。

多くのHTTPリクエストでは、aClass.doMethod()には時間がかかります。私はそれらを並行して実行したいので、続行する前に各http要求を待つ必要はありません。

誰でもこれを達成するためのヒントがありますか?

import java.util.ArrayList; 
import java.util.List; 

//Strategy.java 
public interface Strategy { 
    boolean aMethod(); 
} 

//AStrategy.java 
public class AStrategy implements Strategy { 
    @Override 
    public boolean aMethod() { 
     // Do a couple http requests 
     return true; 
    } 
} 

//BStrategy.java 
public class BStrategy implements Strategy { 
    @Override 
    public boolean aMethod() { 
     // Do some other requests 
     return true; 
    } 
} 

//SomeClass.java 
public class SomeClass { 
    String name; 
    Strategy aStrategy; 

    public SomeClass(String name, Strategy strategy) { 
     this.name = name; 
     this.aStrategy = strategy; 
    } 

    public boolean doMethod() { 
     return aStrategy.aMethod(); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

//Just a regular pojo 
//ResultsClass.java 
public class ResultsClass { 
    String name; 
    boolean result; 

    public ResultsClass(String name, boolean result) { 
     this.name = name; 
     this.result = result; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public boolean isResult() { 
     return result; 
    } 

    public void setResult(boolean result) { 
     this.result = result; 
    } 
} 

public class AClass { 
    public static void main(String args[]) { 
     List<SomeClass> classes = new ArrayList<>(); 
     classes.add(new SomeClass("Class 1", new AStrategy())); 
     classes.add(new SomeClass("Class 2", new BStrategy())); 

     List<ResultsClass> results = new ArrayList<>(); 
     classes.forEach(aClass -> results.add(new ResultsClass(aClass.getName(), aClass.doMethod()))); 

    } 
} 
+2

あなたが実際に求めていることは非常に不明です。また、あなたのソースコードは無効なjava構文の**完全**です。あなたは真剣に後退しなければなりません。例えば、コンパイルして実行する例を記述することから始めます。あなたが解決しようとする問題を示しています。そして正直なところ:構文的に正しいJavaプログラムを書く方法をまだ理解していなければ、今のところマルチスレッドを忘れてしまいます。あなたが実行しようとする前に、クロールを学ぶ。 – GhostCat

+0

構文がないと申し訳ありません...私は自分がやっていたことを思い出して、質問を書いて何か他のものに書き換えることをマルチタスクにしようとしていました。私はそれを編集してコンパイルします.... – TheBlueMan

答えて

1

あなたがこれを行うための最も簡単な方法は、ThreadPoolExecutorを使用する実行可能なあなたの戦略クラスを作るか、ランナブルでそれらをラップし、エグゼキュータに提出すると考えられます。すべてが提出されると、スレッドが完了して先物から結果を取得できるようになるまで、先物をブロックすることができます。

関連する問題