项目中有个功能需要判断某线程在指定时间内是否执行完毕,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方法即可。