Java:使用定时器线程来判断父线程中的行为
Java: use timer thread to determin the behavior in the parent thread
我正在 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 中。
然后当前线程可以在 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
}
}
}
我正在 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 中。
然后当前线程可以在 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
}
}
}