我如何等待后台线程的结果,然后再显示它?

时间:2017-03-18 13:19:57

标签: java concurrency

我有一个关于线程操作的问题,你能帮助我吗?

上下文:假设我们有一系列工作要做,如下所示:

while (true) {
    Info input = getInfo( length );
    Result res = Calculation ( input);
    display(res);
}

问题我遇到的有时候,

  1. 计算(输入)方法花费太多时间导致严重 信息来源漏。
  2. 无论如何,计算结果应该是 顺序显示
  3. 问题:所以,我想知道是否有办法可以执行下面的伪代码?

        Machine machine = new Machine();
        // create either a virtual machine or a thread that runs in parallel
        machine.start();
        while (true) {
             Info input = getInfo( length );
             Work work = new Work() {
                 Result res = Calculation ( input);
                 display(res);
    
             machine.addWork(work);
        }
    

    谢谢,

1 个答案:

答案 0 :(得分:0)

您可以通过向线程池提交任务来并行调用耗时的方法Calculation(input)。要以与获得input的顺序相同的顺序显示计算结果,请使用该任务的队列和单独的线程。

    int poolSize = Runtime.getRuntime().availableProcessors();
    ExecutorService pool = Executors.newFixedThreadPool(poolSize);
    LinkedBlockingQueue<Future<Result>> queue = new LinkedBlockingQueue<>();
    new Thread(() -> {
        while (true) {
            try {
                Result res = queue.take().get();
                display(res);
            } catch (Exception e) {
            }
        }
    }).start();
    while (true) {
        final Info input = getInfo(length);
        Future<Result> res = pool.submit(() -> {
            return Calculation(input);
        });
        queue.put(res);
    }