Java多线程执行程序调用所有问题

时间:2016-01-02 09:49:12

标签: java multithreading concurrency executor

我遇到问题的代码是:

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);

2 个答案:

答案 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 -> {...