2017-01-19 15 views
0

私はjavaとの並行プログラミングに新しく、Callablesを非同期で開始しようとしています。私はプログラムの流れを制御するいくつかのログ・ステートメントを持っている同時実行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); 
    } 
} 

:しかし、コードがCallablesがExecutorServiceのes.invokeAll(tasks)に与えられている私のプログラムの開発の流れを遮断するようです。あなたが見ることができるように、実行は2つのタスクが実行されるまで待つことです。

2017年1月19日16:06:06474 de.cgh.screwminer.service.measurement.MeasurementService(MeasurementService.java:127)INFO [メイン] - Submmittingタスク

2017から01 -199 16:06:08,477 ERROR [プール2スレッド2] de.cgh.screwminer.service.measurement.SensorReadService (SensorReadService.java:68) - センサDrehmomentの読み取り接続は javaを開けない可能性があります。 net.SocketTimeoutException:受信タイムアウト...

2017-01-19 16:06:08,477(センサリードサービス.java:68) - センサクラフトリード接続は を開けませんでしたjava.net.SocketTimeoutException:Received timedアウト...

2017年1月19日16:06:08482 INFO [メイン] de.cgh.screwminer.service.measurement.MeasurementService (MeasurementService.java:132) -

答えて

0
を提出したタスク

invokeAllのJavadocから:

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タスクが完了しました。

あなたができることは、クラス内のExecutorを保持し、forEach()で各タスクを実行することです。次に、エラーをチェックする先物のリストを取得します。

あなたはこのような何か行うことができます:

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

CompletableFutureがJava8機能であり、あなたは彼らが正常に完了した場合、あなたは、多くの場合、予期しない非につながる(先物を依頼する必要がないのでうまくエラーを制御することができますがログに記録されたエラー)

関連する問題