如何同时在具有不同线程的对象内运行方法?

时间:2016-08-16 15:34:13

标签: java multithreading

我的设置如上所述。我想要实现的是在我的每个实现的类中都有aMethod并行运行。我已经研究过使用FutureRunnable,我不确定如何继续这两个过程。

我的第一个想法是尝试返回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())));

    }
}

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用ThreadPoolExecutor,使策略类可运行或将它们包装在runnables中,然后将它们提交给执行程序。一旦提交完毕,您就可以阻止期货直到线程完成,您可以从期货中检索结果。