我遇到问题的代码是:
Executor executor = (Executor) callList;
List<ProgState> newProgList = executor.invokeAll(callList).stream()
.map(future -> {try {return future.get();} catch(Exception e){e.printStackTrace();}})
.filter(p -> p!=null).collect(Collectors.toList());
对于类型Executor
,方法invokeAll(List&gt;)未定义
我被告知我应该使用类似代码片段中的执行程序。
Callables在以下代码中定义:
List<Callable<ProgState>> callList = (List<Callable<ProgState>>) lst.stream()
.map(p -> ((Callable<ProgState>)(() -> {return p.oneStep();})))
.collect(Collectors.toList());
这是老师的代码:
//prepare the list of callables
List<Callable<PrgState>> callList = prgList.stream().map(p -> (() -> {return p.oneStep();})).collect(Collectors.toList());
//start the execution of the callables
//it returns the list of new created threads
List<PrgState> newPrgList = executor.invokeAll(callList).stream()
.map(future -> { try {
return future.get();
}
catch(Exception e) {
//here you can treat the possible
// exceptions thrown by statements
// execution
}
})
.filter(p -> p!=null).collect(Collectors.toList());
//add the new created threads to the list of existing threads
prgList.addAll(newPrgList);
答案 0 :(得分:1)
如果你可以使用stream(),为什么不使用parallelStream(),因为它会更简单。
List<PrgState> prgStates = prgList.parallelStream()
.map(p -> p.oneStep())
.collect(Collectors.toList());
这样就没有线程池可以在完成时配置,启动或停止。
有些人可能会建议parallelStream()
是首先将Stream和lambdas添加到Java 8的主要原因。 ;)
答案 1 :(得分:0)
您无法使用ExecutorService转换Callables列表。您需要定义ExecutorService,它将获取callables并在一个或多个线程中并行执行它们。
这就是我认为你所追求的:
ExecutorService executor = Executors.newCachedThreadPool();//change executor type as per your need.
List<ProgState> newProgList = executor.invokeAll(callList).stream().map(future -> {...