可以使用while循环进行调用

时间:2017-05-11 10:31:23

标签: java java.util.concurrent

我需要提供使用ExecutorService的代码,Callable和Future将进行一些计算并打印部分结果,直到达到定义的条件。我想到的第一件事是使用while循环。不幸的是,据我所知ExecutorService.get()等待任务完成,所以我不能做(伪代码):

public Object call() throws Exception {
  try {
    while(!condition)           {
      //perform calc
      return partialCalculationResult;
    }
  }
  catch(InterruptedException e){ 
  }
}

有人可以指导我应该采取哪些正确的方向吗?

4 个答案:

答案 0 :(得分:3)

这里:

while(!condition) {
  //perform calc
  return partialCalculationResult;
}

表示"洞"在你的逻辑中。这可能应该是这样的:

while(!condition) {
  // perform computation
  push intermediate results somewhere
}
return finalResult;

换句话说:你在这里谈论两个不同的元素。对于那些"进步"更新您将需要某种共享数据结构;例如队列

你知道,与其他语言不同,没有内置的"生成器"允许您从循环中产生值的概念;例如,您可以在pythonscala中执行此操作。

答案 1 :(得分:1)

脏选项是在while循环中放置System.out.println

清洁选项将是发布/订阅者模式,如:

interface Subscriber {
    void onPartialResult(double partialResult);
}
class SystemOutSubscriber implements Subscriber{
    @Override
    void onPartialResult(double partialResult) {
        System.out.println(partialResult);
    }
}
class YourCalculatorClass {
    List<Subscriber> subscribers = ...
    public Object call() throws Exception {
       while(!condition) {
          //perform calc
          for(Subscriber s : subscribers) {
              s.onPartialResult(partialCalculationResult);
           }
        }
     }
}

答案 2 :(得分:0)

您可以使用Thread.interrupt在循环中停止线程并在列表中添加剩余结果

  

while(!condition){list.add(addResultHere)   了Thread.interrupt(); }

答案 3 :(得分:0)

以下是使用ExecutorService的一个小例子 推动可调用的任务。为了方便示例,我现在将它们推入while循环中,但它们可以来自任何地方。可调用本身使用最愚蠢的简单示例,当然它需要一个数字。如果数字低于5,一切都很好,我们会返回一个文本。如果没有,我们什么都不返回。当评估未来并且结果为空时,我们关闭ExecutorService并将其称为一天。所以,这是一个使用ExecutorServiceCallableFuture做一些事情的例子,至少类似于我从你的解释中可以看到的内容。

public ExecutorServiceTest() {
    ExecutorService service = Executors.newCachedThreadPool();
    int num = 0;
    while (true) {
        Future<Optional<String>> future = service.submit(new MyCallable(num++));

        try {
            Optional<String> result = future.get();
            if (!result.isPresent()) {
                service.shutdown();
                break;
            }
            System.out.println(result.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
            service.shutdown();
        }
    }
}

private static class MyCallable implements Callable<Optional<String>> {
    private final int num;

    MyCallable(int num) {
        this.num = num;
    }

    @Override
    public Optional<String> call() throws Exception {
        if (num < 5)
            return Optional.of("My number is " + num);
        return Optional.empty();
    }
}

public static void main(String[] args) {

    new ExecutorServiceTest();
}