如何使用带有void返回类型的Callable?

AKI*_*WEB 55 java multithreading callable

我正在开发一个项目,其中我有多个接口和两个实现类,需要实现这两个接口.

假设我的第一个接口是 -

public Interface interfaceA {
    public void abc() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

它的实施是 -

public class TestA implements interfaceA {

// abc method
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它 -

TestA testA = new TestA();
testA.abc();
Run Code Online (Sandbox Code Playgroud)

现在我的第二个界面是 -

public Interface interfaceB {
    public void xyz() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

它的实施是 -

public class TestB implements interfaceB {

// xyz method   
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它 -

TestB testB = new TestB();
testB.xyz();
Run Code Online (Sandbox Code Playgroud)

问题陈述:-

现在我的问题是 - 有什么办法,我可以并行执行这两个实现类吗?我不想按顺序运行它.

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

我想在这里使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了编译错误..

更新: -

看起来很多人都建议使用Runnable而不是callable.但不知道如何在这里使用Runnable以便我可以TestA and TestB并行执行.

nos*_*sid 75

您可以使用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()
Run Code Online (Sandbox Code Playgroud)


Rog*_*gue 5

为什么在并行运行某些东西时需要空白?例如,如果您不需要返回值,则只需返回即可null.

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

  • ExecutorService可能是并行执行两个任务的最佳方法.它还支持_Runnable_.但是,_Callable_还具有支持任意异常的优点. (5认同)
  • Rogue-在这种情况下使用可调用对象有什么问题? (4认同)