2016-08-16 80 views
-1

我的設置如上所述。我想要完成的是在每個實現的類中並行運行aMethod。我研究過使用Future s和Runnable,我不確定如何進行這兩個過程。如何同時在不同線程的對象中運行一個方法?

我的第一個想法是嘗試返回Future<Boolean>而不是常規的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,讓你的策略類可運行或可運行包好,並將其提交給執行。一旦提交完成,您可以阻止期貨,直到線程完成,您可以從期貨中檢索結果。

相關問題