0

callable を executor に送信し、未来を ID に対するマップに格納するコードをいくつか書きました。call メソッドでは、続行する前にフラグが設定されるのを待ちます。基本的に、外部操作が私に戻ってくるのを待って、完了したと言う必要があります-これがデータであり、続行できます...私が持っているものが正しいとは思いません:

public class MyClass implements Callable<Boolean> {

    ---
    ---
    private boolean done = false;

    @override
    public Boolean call() {

        --  wait for flag to be set...
        //continue....
    }

}

--メインコード--

//create the above class..

//submit it...

//get the future store in map...

//-- wait for response from external application...

///tie it up with an id

//set the attribute so the callable can continue and complete..

質問:

  1. オブジェクトではなく Future が返されるため、上記は機能しません。呼び出し可能なクラスから継承する新しいインターフェイスを作成することを考えていました-それは理にかなっていますか?

  2. スレッドが待機し、応答が受信されない場合は終了する必要があります。それをスレッドに設定することはまったく可能ですか?

4

3 に答える 3

3

待機中のタスクをキャンセルするタスクをスケジュールできます。待機中のタスクが終了すると、スケジュールされたタスクをキャンセルできます。(先に終了した方は、もう一方をキャンセルします)

これは、そもそも中断可能なタスクがあることを前提としています。

于 2012-07-13T13:02:31.927 に答える
0

利用可能な待機(長いタイムアウト)機能があります..いくつかのドキュメントがあります

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html

この wait(long timeout) 関数を使用すると、スレッドは notify() (または notifyAll()) を取得するまで、またはタイムアウトが期限切れになるまで待機します。

次のいずれかは、wait(); を中断します。

  1. 通知();
  2. notifyAll();
  3. タイムアウトに達する
于 2012-07-13T13:04:34.680 に答える
0

を使用しFuture#get(long, TimeUnit)ます。

これは、応答をしばらく待ちTimeoutException、指定された期間に戻り値がない場合にスローします。次に、例外をキャッチして、スレッドを無事に終了させます。

于 2012-07-13T13:05:07.453 に答える