2017-01-19 2 views
0

Я новичок в параллельном программировании с помощью java и пытаюсь запустить асинхронно с Callables. Но код, кажется, блокировать мой поток программки, где Callables отдается ExecutorService es.invokeAll(tasks):Concurrent Execution Java 8

public void checkSensorConnections(boolean fireEvent) { 
    List<Callable<Void>> tasks = new ArrayList<>(); 

    getSensors().forEach(sensor -> { 
     tasks.add(writerService.openWriteConnection(sensor)); 
     tasks.add(readerService.openReadConnection(sensor)); 
    }); 

    try { 
     LOG.info("Submmitting tasks"); 

     ExecutorService es = Executors.newWorkStealingPool(); 
     es.invokeAll(tasks); 

     LOG.info("Tasks submitted"); 
    } catch (InterruptedException e) { 
     LOG.error("could not open sensor-connections", e); 
     error(MeasurmentScrewMinerError.OPEN_CONNECTION_ERROR); 
    } 
} 

У меня есть некоторые операторы журнала управление потоком программы. Как вы можете видеть, выполнение выполняется до тех пор, пока не будут выполнены две задачи.

2017-01-19 16: 06: 06474 INFO [главная] de.cgh.screwminer.service.measurement.MeasurementService (MeasurementService.java:127) - Submmitting задачи

2017-01 -19 16: 06: 08,477 ОШИБКА [пул-2-нить-2] de.cgh.screwminer.service.measurement.SensorReadService (SensorReadService.java:68) - датчик Drehmoment для чтения-подключения может не открывается java. net.SocketTimeoutException: получение тайм-аута ...

2017-01-19 16: 06: 08,477 ОШИБКА [пул-2-нить-4] de.cgh.screwminer.service.measurement.SensorReadService (SensorReadService.java:68) - датчик Крафт чтения соединение не может быть открыт java.net.SocketTimeoutException: Получение приурочено из ...

2017-01-19 16: 06: 08482 INFO [главная] de.cgh.screwminer.service.measurement.MeasurementService (MeasurementService.java:132) - Задачи, представленные

ответ

0

От Javadoc invokeВсе:

Returns: 
    a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list, each of which has completed 

Так что да invokeAll Задачи закончены.

Что вы можете сделать, так это просто удерживать Исполнителя в классе и отправлять каждую задачу в ваш forEach(), который будет делать то же самое. Затем вы получаете список фьючерсов, которые вы должны проверить на наличие ошибок.

вы могли бы сделать что-то вроде этого:

getSensors().forEach(s -> { 
    CompletableFuture<Void> cf = (s -> writerService.openWriteConnection(s)).exceptionally(ex -> errorhandling) 
    exec.submit(cf) 
}); 

CompletableFuture является функцией Java8 и позволяет контролировать ошибки хорошо, как вам не придется задавать фьючерсы, если они успешно завершены (что часто приводит к неожиданным Неправительственному зарегистрированные ошибки)