我需要提供使用ExecutorService的代码,Callable和Future将进行一些计算并打印部分结果,直到达到定义的条件。我想到的第一件事是使用while循环。不幸的是,据我所知ExecutorService.get()等待任务完成,所以我不能做(伪代码):
public Object call() throws Exception {
try {
while(!condition) {
//perform calc
return partialCalculationResult;
}
}
catch(InterruptedException e){
}
}
有人可以指导我应该采取哪些正确的方向吗?
答案 0 :(得分:3)
这里:
while(!condition) {
//perform calc
return partialCalculationResult;
}
表示"洞"在你的逻辑中。这可能应该是这样的:
while(!condition) {
// perform computation
push intermediate results somewhere
}
return finalResult;
换句话说:你在这里谈论两个不同的元素。对于那些"进步"更新您将需要某种共享数据结构;例如队列。
你知道,与其他语言不同,没有内置的"生成器"允许您从循环中产生值的概念;例如,您可以在python或scala中执行此操作。
答案 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并将其称为一天。所以,这是一个使用ExecutorService
,Callable
和Future
做一些事情的例子,至少类似于我从你的解释中可以看到的内容。
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();
}