我正在开发一个项目,其中我有多个接口和两个实现类,需要实现这两个接口。
假设我的第一个界面是 -
public Interface interfaceA {
public void abc() throws Exception;
}
其实施是 -
public class TestA implements interfaceA {
// abc method
}
我这样称呼它 -
TestA testA = new TestA();
testA.abc();
现在我的第二个界面是 -
public Interface interfaceB {
public void xyz() throws Exception;
}
其实施是 -
public class TestB implements interfaceB {
// xyz method
}
我这样称呼它 -
TestB testB = new TestB();
testB.xyz();
问题陈述: -
现在我的问题是 - 有什么办法,我可以并行执行这两个实现类吗?我不想按顺序运行它。
意思是,我希望并行运行TestA
和TestB
?这可能吗?
我想在这里使用Callable,但不知道如何在这里使用带有void返回类型的Callable -
让我们以TestB类为例:
public interface interfaceB {
public void xyz() throws Exception;
}
public class TestB implements interfaceB, Callable<?>{
@Override
public void xyz() throws Exception
{
//do something
}
@Override
public void call() throws Exception
{
xyz();
}
}
上面的代码给出了编译错误..
更新: -
看起来很多人都建议使用Runnable而不是callable。但不知道如何在这里使用Runnable以便我可以并行执行TestA and TestB
。
答案 0 :(得分:72)
您可以使用 java.lang.Thread 进行并行执行。但是,在大多数情况下,使用 java.util.concurrent.ExecutorService 更容易。后者提供了一种方法来提交 Callable 并返回 Future 以便稍后获得结果(或等待完成)。
如果 testA.abc()和 testB.xyz()应该并行执行,则使用 ExecutorService 执行前者在单独的线程中,而后者在原始线程中执行。然后等待前者完成同步。
ExecutorService executor = ... // e.g. Executors.newFixedThreadPool(4);
Future<Void> future = executor.submit(new Callable<Void>() {
public Void call() throws Exception {
testA.abc();
return null;
}
});
testB.xyz();
future.get(); // wait for completion of testA.abc()
答案 1 :(得分:5)
为什么在并行运行某些东西时需要空格?例如,如果您不需要返回值,则只需返回null
。
要使某些内容并行,您需要使用线程/调度。我个人建议避免使用Callables,而使用Runnables(嘿,没有返回值)。
答案 2 :(得分:1)
较短的版本:
ExecutorService executor = ... // e.g. Executors.newFixedThreadPool(4);
Future<?> future = executor.submit(() -> testA.abc());
testB.xyz();
future.get(); // wait for completion of testA.abc()
要注意的是,必须并行运行某些内容而没有返回任何内容可能是错误模式的信号:)
此外,如果您在Spring环境中,则可以使用:https://spring.io/guides/gs/async-method/