2017-01-31 12 views
0

この基本的な質問は少し恥ずかしいですが、ここにあります。Java:元のスレッドの文脈で、別のスレッドからコールバックを呼び出す

私は、メインクラスとワーカースレッドを持っているとしましょう。ワーカースレッドはいくつかの非同期作業を行い、その結果をメインクラスのコールバックに返します。

私が苦労しているのは、メインクラスのコールバックがワーカースレッドの一部として実行されることです。私はこれを十数回やったことがありますが、それは私には何の問題も生じませんでしたが、ワーカースレッドからの応答を実際のメインスレッドにエレガントに返す方法が不思議です。

私はFutureFutureTaskなどを使用することができますが、それは私には気難しいと感じています。

例:

class ThreadTest { 
     private Runnable mRunnable; 

     public ThreadTest() { 
       System.out.println("ThreadTest(): thread " + Thread.currentThread().getId()); 
       mRunnable = new Runnable() { 
         public void run() { 
           System.out.println("run(): thread " + Thread.currentThread().getId()); 
           print(); 
         } 
       }; 
       new Thread(mRunnable).start(); 
     } 
     private void print() { 
       System.out.println("print(): thread " + Thread.currentThread().getId()); 
     } 
     public static void main(String... args) { 
       System.out.println("main(): thread " + Thread.currentThread().getId()); 
       ThreadTest t = new ThreadTest(); 
     } 
} 

出力:

main(): thread 1 
ThreadTest(): thread 1 
run(): thread 9 
print(): thread 9 

私が取得したいと思い何を:そのような問題へ

main(): thread 1 
ThreadTest(): thread 1 
run(): thread 9 
print(): thread 1 
+0

私はちょうど1,2時間コンピュータから離れていました... – fjc

+0

心配しないでください。 - 。) – GhostCat

答えて

1

一つの一般的な解決策は、 "通信チャネル" を提供することですあなたのメインスレッドとワーカースレッドの間。

つまり、一方の側が書き込むことができ、他方の側を読み取ることができるデータ構造を配置します。

これを行う一般的な方法は、ConcurrentLinkedQueueを使用することです。 詳細はhereを参照してください。シンプルなプロデューサ/コンシューマシナリオを含む

これを超えると、デザインがより明確になるはずです。私は

  1. に何かをするワーカースレッドを焦点を当てるのいずれか、およびメインのコールバックをトリガ将来
  2. いくつかのスレッドBを使用して(「それを拾う」のための)結果を提供します。私は何を意味していますある時点でスレッド。

つまり、これは「プル」(未来を使用)または「プッシュ」(コールバックメソッドを呼び出すスレッドB)と見ることができます。私は1つのの概念を決定することを提案し、2つの概念の "50%"を同時に使用することはお勧めしません!

1

wait()notify()を使用するのが最も洗練された解決策です。

私は、とりわけ、java8とCompletableFutureについて話している場合は、先物については何も気にしないと主張します。

+0

先物について本質的にぎこちないことは何もありません。 – Kayaman

関連する問題