Java:使用计时器线程来确定父线程的行为



我正在用java编写代码,我正在从另一个系统发出请求。我想,如果我不会得到响应,而我计数(并行),我将调用发送错误函数或抛出异常被捕获在主线程

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

StartTimer()如何计数2分钟,检查ExecuteOperation()是否返回,如果2分钟已经过去,抛出MyException,将在主线程中被捕获?

首先,许多阻塞API调用都有一个超时参数,您可以使用。

如果没有,我会把它转过来,在后台线程上做executeOperation位,在Future中包装。

当前线程可以在指定超时的情况下在未来调用get

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

您可以使用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
        }
    }
}

最新更新