项目中有个功能需要判断某线程在指定时间内是否执行完毕,FutureTask正好可以实现此功能,FutureTask有个get(long timeout, TimeUnit unit)方法,可以指定超时时间,若超时会抛出TimeoutException。
被调方实现:
public <T> void startTimer(Callable<T> task, long timeout) throws TimeoutException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
FutureTask<T> futureTask = (FutureTask<T>) executorService.submit(task);
executorService.execute(futureTask);
try {
futureTask.get(timeout, TimeUnit.SECONDS);
} catch (TimeoutException e) {
throw e;
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw new TimeoutException();
} finally {
executorService.shutdown();
}
}
调用时需要传入Callable,调用方:
// 3. 设置定时器: 若限时内所有网关响应状态未清除,则抛出异常
try {
timerUtil.startTimer(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
// 循环判断网关响应状态
while (true) {
if (!msgResponseStatusService.checkGWResponseStatus(sessionId)) break;
}
// 若响应状态记录已不存在则返回
return true;
}
}, timeout);
} catch (TimeoutException e) {
logger.info("response from gateway is timeout: {} seconds", timeout);
调用时实现Callable接口中的Call方法即可。
本文介绍如何利用FutureTask的get方法实现线程任务的超时控制。通过创建一个执行器并提交Callable任务,设置特定的超时时间,若任务未能在此时间内完成将抛出TimeoutException。
3836

被折叠的 条评论
为什么被折叠?



