如何将 Callable 与 void 返回类型一起使用



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

假设我的第一个接口是 -

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实现?这可能做到吗?

我想在这里使用可调用,但不确定如何在此处使用带有无效返回类型的可调用 -

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

您可以使用 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()

为什么需要一个空白来运行 Parallel 的东西?首先,如果您不需要返回值,您可以简单地返回 null .

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

较短的版本:

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/

相关内容

  • 没有找到相关文章

最新更新