如何使用空返回类型的 Callable?

我正在从事一个项目,其中我有多个接口和两个实现类,需要实现这两个接口。

假设我的第一个 Interface 是-

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();

问题陈述:-

现在我的问题是-有没有办法,我可以并行地执行这两个实现类?我不想连续运行。

意思是,我想并行运行 TestATestB实现? 这可能做到吗?

我想在这里使用 Callable,但不确定如何使用 Callable with void return type-

让我们以 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 而不是 call。但是不确定如何在这里使用 Runnable 以便并行执行 TestA and TestB

98407 次浏览

为什么在并行运行时需要一个 void?首先,如果不需要返回值,可以简单地返回 null

要使某些东西并行,您需要使用线程/调度。我个人建议避免使用 Callables,而是使用 Runnables (嘿,没有返回值)。

可以使用 Java.lang 线程进行并行执行。然而,在大多数情况下,使用 并发执行服务更容易。后者提供了一个提交 可呼叫并返回 未来的方法,以便稍后获得结果(或等待完成)。

如果 TestA.abc ()TestB.xyz ()应该并行执行,则使用 执行服务在单独的线程中执行前者,而后者在原始线程中执行。然后等待前者完成同步。

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()

简而言之:

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/