2016-12-01 5 views
0

スレッドプールを実装して、別のスレッドで実行されるいくつかのタスクを実装する必要があります。問題は2です:私は戻り値が必要で、戻り値は準備ができたらすぐに使用する必要があります。 今のところ私のコードは価値を返しています。問題は、メインスレッドのスレッドの状態をチェックすることができないためです。私は実装する方法を知らないコールバックが必要です。簡単な例のためのいくつかの助け?私はかなり多くを検索し、私は私のニーズに合った何かを見つけることができません。 これは私のCallable次のとおりです。Thread Executorと通知でCallableを簡単に実装する

public class MyAsyncCallable<V> implements Callable<V> { 

    CallbackInterface ci; 

    public MyAsyncCallable(CallbackInterface ci) { 
     this.ci = ci; 
    } 

    public V call() throws Exception { 

     System.out.println("Call of MyCallable invoked"); 
     System.out.println("Result = " + this.ci.doSomething(10, 20)); 
     return (V) "Good job"; 
    } 
} 

public interface CallbackInterface { 
    public int doSomething(int a, int b); 
} 

とメイン:

MyAsyncCallable<String> mac = new MyAsyncCallable<String>((a, b) -> a + b); 
ex.submit(mac); 

私はそれを求めて、メインスレッドをブロックせずに結果を得るにはどうすればよいですか?

+0

「文字列」を返す場合は、一般的な点は何ですか? –

+0

'ex.submit'は' Future 'を返します。あなたはそれから結果を得ることができます。 –

+0

私はそれが何をしているか知っています。問題は私が '.get()'する必要があり、タスクが準備ができていない場合、私はnullを取得します。私はそれを呼び出しているスレッドをブロックするため、私は結果を得るまで、私はループを 'get()'を傾ける.... –

答えて

0

スイングでアプリケーションを作成している場合、ワーカースレッドの終了時にinkvokeLaterを使用してGUIを更新することはできませんか?

public V call() throws Exception { 

    System.out.println("Call of MyCallable invoked"); 
    System.out.println("Result = " + this.ci.doSomething(10, 20)); 
    //... 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      updateView(); 
     } 
    }); 
    //... 
    return (V) "Good job"; 
} 
関連する問題