2016-11-01 5 views
1

私はJavaでコードを書いています。私は別のシステムから要求を出しています。私は(パラレル)をカウントしていながら、私は応答を取得することはできません場合、私はメインスレッドでcatchedされる誤差関数を送信呼び出すか、例外をスローすることを望んStartTimer()カウント2分、チェックをしてどのようにJava:親スレッドの動作を決定するためにタイマースレッドを使用する

try { 
    StartTimer(); 
    result = request.ExecuteOperation(); 
    sendSuccess(result); 
} 
catch (MyExeption ex) { 
    handleExeption(ex!= null? ex.getMessage(): "General Exeption", ex, systemID) 
} 

ExecuteOperation()が返され、2分が経過してMyExceptionがスローされた場合は、メインスレッドで捕捉されますか?

+1

Javaスレッド:notify()とwait()を試しましたか? – user1697575

答えて

3

まず、多くのブロックAPIコールには、使用できるタイムアウトパラメータがあります。

もしそうでなければ、私はこれを回して、バックグラウンドスレッドのexecuteOperationビットをFutureでラップします。

現在のスレッドは、タイムアウトを指定してFutureにgetを呼び出すことができます。

Future<MyResult> futureResult = executor.submit(new Callable<MyResult>(){ 
    void call(){ 
     return request.ExecuteOperation(); 
    } 
}); 
return futureResult.get(2, TimeUnit.MINUTES); 
0

CountDownLatch,https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html#await(long,%20java.util.concurrent.TimeUnit)を使用できます。次のようなものがあります。

public class Test { 

    public void executeOperation(CountDownLatch latch) { 
     // runs on separate thread and perform the operation 
     latch.countDown(); 
    } 

    public static void main(String[] args) throws Exception { 
     Test test = new Test(); 

     CountDownLatch latch = new CountDownLatch(1); 
     test.executeOperation(latch); 
     if (!latch.await(2, MINUTES)) { 
      // report an error 
     } 
    } 
} 
+0

この関数は、カウントが0になるのを待ちます。カウント中にエグゼクティブを実行し、カウントが送信エラーを処理する前に終了するようにします。 else:すべての良いcountinueプログラム; – SteveBl

関連する問題