2016-08-16 43 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,让你的策略类可运行或可运行包好,并将其提交给执行。一旦提交完成,您可以阻止期货,直到线程完成,您可以从期货中检索结果。

相关问题