2016-05-02 9 views
1

Java Futureオブジェクトは、並列スレッド(Executors)によって実行される非同期計算の結果を取得するために使用されます。 Future.get()メソッドを呼び出し、結果が準備できるまで待ちます。この例は、Futureから結果を取得するための非ブロッキング方法を示しています。 java-implement-java-non-blocking-futuresJavaで非ブロッキング先物を実装する方法

NonBlockingExecutor executor = new NonBlockingExecutor(Executors.newSingleThreadExecutor()); 

NonBlockingFuture<Integer> future = executor.submitNonBlocking(new Callable<Integer>() { 

      @Override 
      public Integer call() throws Exception { 
       String threadName = Thread.currentThread().getName(); 
       System.out.println(threadName); 
       //print -> pool-1-thread-1 
       return 1; 
      } 
}); 

future.setHandler(new FutureHandler<Integer>() { 

     @Override 
     public void onSuccess(Integer value) { 
      String threadName = Thread.currentThread().getName(); 
      System.out.println(threadName); 
      //print -> pool-1-thread-1 
     } 

     @Override 
     public void onFailure(Throwable e) { 
      System.out.println(e.getMessage()); 
     } 
}); 

Thread.sleep(50000); 

このonSuccess()メソッドは、パラレル実行が終了した後に呼び出されます。問題は、onSuccess()メソッドがメインスレッドで実行されていないことです。私はメインスレッドでonSuccess()メソッドを実行したい。どのように私はこれを修正することができます。ありがとう

+1

おそらく、あなたのメインスレッドは何か他のことをしています。 –

+0

正直なところ、私はエグゼクティブとそのことについてどうやって行くべきか分かりません。それ以外の場合はすべて失敗します。コレクションにデータを渡すだけで、メインスレッドはこのコレクションのデータを見て、適切に応答します。 – KookieMonster

+0

Java 8 CompletableFutureを使用してこれを行うことはできますか? – Tharanga

答えて

1

Futureのポイントは、関連する計算が別のスレッドで実行されることです。 onSuccessメソッドは、別個のスレッドが計算の実行を終了したと言う方法です。メインスレッドが計算を実行せず、計算がいつ完了するかを知らないので、メインスレッドがonSuccessを呼び出すことは意味を成さない。

計算が完了して結果を得るのを待つ場合は、メインスレッドからget()に電話してください。計算が完了しているかどうかチェックし、まだ完了していない場合は他の作業を続けたい場合は、isDone()またはget(long, TimeUnit)に電話してください。完了したかどうかにかかわらず計算を終了する場合は、cancel()に電話してください。

+1

ありがとうございます。はい、正しいですが、get()はブロック操作です。私たちはCompletableFutureを使ってこれを行うことができますが、私は同じ問題に直面しました。結果はメインスレッド上での処理ではありません。 [CompletableFuture](http://stackoverflow.com/questions/36981432/why-completablefuture-s-thenaccept-not-running-on-the-main-thread) – Tharanga

+0

私が言及する他のオプションは、ノンブロッキングか、限定されたブロックのみです時間。 –

1

メインスレッドでonSuccess()メソッドを実行します。どのように私はこれを修正することができます。

できません。 Javaの何もスレッドがやっていたことを止めさせることはできませんし、何か他のことをしばらくしてから、何をしていたのかに戻ることはできません。いくつかのプログラミング環境は--- Unix シグナル、ハードウェアは割り込み ---しかし、それはJava言語の一部ではありません。

1

これはCompletableFuturesでサポートされています。

CompletableFuture.runAsync(() -> { 
     String threadName = Thread.currentThread().getName(); 
     System.out.println(threadName); 
     //print -> pool-1-thread-1 
    }).whenComplete((task, throwable) -> { 
     if(throwable != null) { 
      System.out.println(e.getMessage()); 
     } else { 
      String threadName = Thread.currentThread().getName(); 
      System.out.println(threadName); 
      //print -> pool-1-thread-1 
     } 
    }); 

ここで注意すべき点は、今後は、実行中のスレッドではなく提出スレッドでwhenCompleteタスクを実行するだろうということです。

関連する問題