代码之家  ›  专栏  ›  技术社区  ›  AKIWEB

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

  •  74
  • AKIWEB  · 技术社区  · 11 年前

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

    假设我的第一个接口是-

    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 并行地。

    3 回复  |  直到 11 年前
        1
  •  94
  •   nosid    11 年前

    您可以使用 java.lang.Thread(java.lang.Tthread) 用于并行执行。然而,在大多数情况下,使用 java.util.concurrent.ExecutorService 。后者提供了一种提交 可调用的 并返回 将来 以稍后获得结果(或等待完成)。

    如果 测试A.abc() 测试B.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()
    
        2
  •  4
  •   Rogue    11 年前

    为什么你需要一个并行运行的空间?首先,如果不需要返回值,可以简单地返回 null .

    要实现并行,需要使用线程/调度。我个人建议避免Callables,改用Runnables(嘿,没有返回值)。

        3
  •  2
  •   AddJ    5 年前

    较短版本:

    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/