2017-01-19 3 views
3

こんにちは私はJava Futuresについて簡単に質問しました。私はこのスニペットに問題が決裂:Java Futureはいつもnullを返す

ExecutorService service = Executors.newCachedThreadPool(); 
    try { 
     System.out.println(service.submit(new FutureTask<>(() -> true)).get()); 
    } catch (InterruptedException e1) { 
     e1.printStackTrace(); 
    } catch (ExecutionException e1) { 
     e1.printStackTrace(); 
    } 

私は私の端末で出力に「真」これを期待しています。しかし、代わりに常にnullを出力します。私は何が欠けていますか?

答えて

3

それはロジックをオフに投げFutureTaskです。 () -> trueCallable<Boolean>です。trueですが、FutureTaskは値を返さないRunnableです。したがって、submitは、Runnableパラメータを取得しているため、Callableではなく、Future<Void>を返します。常にnullが含まれています。

不要なFutureTaskラッパーを削除し、Callableを直接使用してください。

+0

おかげで、それが問題です。 – Cydhra

0

問題はFutureTaskです。あなたがCallableRunnableであなたのサービスを呼び出す場合、期待どおり、それが動作し、その結果を返します:

Future<?> result = service.submit(() -> true); 

System.out.println(result.get()); // prints true 
2

FutureTaskExecutorService.submit(Runnable)方法Runnableインターフェース

フォームのJavaドキュメント延び:

を実行するためのRunnableタスクを送信し、そのタスクを表すFuture を返します。未来の{@code get}メソッドは、が成功したときに {@code null}を返します。が成功しました。

あなたがCallableを使用することができる結果を得るために:

System.out.println(service.submit(() -> true).get()); 

またはタスクに起因します:

FutureTask<Boolean> task = new FutureTask<>(() -> true); 
service.submit(task); 
System.out.println(task.get()); 
関連する問題