在java

时间:2017-10-25 17:39:43

标签: java multithreading executorservice

我有以下课程

Class Results {
    ResultA resultA;
    ResultB resultB;
    ResultC resultC;
}

ResultA, ResultB, ResultC的类型不同,不能适合一个类层次结构。

我有一个DAO与db对话以获得上述结果

Class ResultDAO {
    ResultA getResultA(/*takes non-zero argument list*/) {

    }

    ResultB getResultB(/*takes non-zero argument list*/) {

    }

    ResultC getResultC(/*takes non-zero argument list*/) {

    }

}

我需要通过调用DAO方法获得三个结果resultA, resultB, resultC。这需要同时发生。我使用了一个执行程序服务,并通过以下方式在不同的匿名callables中调用上述三种方法。虽然没有返回类型,但是在runnables上使用callables的原因是因为ResultDAO抛出了已检查的异常而Runnable没有传播已检查的异常而Callable会这样做。

Result getResult() {
    List<Callable<Void>> tasks = new ArrayList<>();
    Results results = new Results();

    tasks.add(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            results.setResultA(resultDAO.getResultA(/*non-zero params*/));
            return null;
        }
    });

    tasks.add(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            results.setResultB(resultDAO.getResultB(/*non-zero params*/));
            return null;
        }
    });

    tasks.add(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            results.setResultC(resultDAO.getResultC(/*non-zero params*/));
            return null;
        }
    });

    List<Future<Void>> futures = executorService.invokeAll(tasks); 
    for(Future<Void> future: futures) {
        future.get();
        /*removing the exception handling part of future.get() for brevity*/
    }
    return result;
}

上述实现显然不是很好并且代表代码味道。要进一步修改,编写测试和维护代码并不容易和直接。为简单起见,我在问题中只包含了3种结果类型。但实际实施中还有更多内容,这就是为什么它难以管理代码

我无法找到上述问题的最佳做法。任何人都可以建议更好的实施吗?

0 个答案:

没有答案