2016-01-02 4 views
0

код У меня возникли проблемы с является:Java Multi-Thread Палач InvokeAll Проблемы

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

Метод invokeAll (List>) не определено для типа Исполнителю

Я сказал, что я должен использовать исполнителя, как тот, что в фрагменте кода.

В вызываемых объектов определяются в следующем коде:

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

Возможно, мне не хватает чего-то элементарного и очевидного, но как вы можете отнести список вызываемых материалов для исполнителя? Разве вы не создали бы свою ExecutorService и не передали бы этот список? –

+0

Я не уверен в себе. Я всего лишь студент, и я пытаюсь понять пример учителя. –

+0

Ваш код выглядит очень неправильно для меня. Какая часть - код учителя, и какая часть принадлежит вам? Вы знаете, как работают исполнители? –

ответ

0

Вы не можете бросить список вызываемых объектов с ExecutorService. Вам необходимо определить ExecutorService, который будет забирать вызовы и выполнять их в одном или нескольких потоках параллельно.

Это то, что я думаю, что вы после:

ExecutorService executor = Executors.newCachedThreadPool();//change executor type as per your need. 
List<ProgState> newProgList = executor.invokeAll(callList).stream().map(future -> {... 
+0

Спасибо! Это сработало! –

1

Если вы можете использовать поток(), почему бы не parallelStream(), как это было бы гораздо проще.

List<PrgState> prgStates = prgList.parallelStream() 
            .map(p -> p.oneStep()) 
            .collect(Collectors.toList()); 

Таким образом, у вас нет пула потоков для настройки, запуска или остановки по завершении.

Возможно, что parallelStream() был основной причиной добавления Stream и lambdas в Java 8. ;)

Смежные вопросы