关于这个问题,不清楚您想要如何使用超时。这里给您提供两种实现轻量级超时的选项:监控和控制。
监控超时
对于全局计时器,您可以使用JDK中的
Timer
工具:
public TimeoutTask implements TimerTask {
List<MonitorableObject> objects;
public TimeoutTask(List<MonitorableObject> objects) {
this.objects = objects;
}
public void run() {
}
}
Timer timer = new Timer();
timer.schedule(new TimeoutTask(myObjectList), 0,60*1000);
可以使用 ScheduledExecutorService
实现类似的构造:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// Note that I can use here TimeoutTask b/c TimerTask is a Runnable -
// this is just for the example. You'd better implement a plain runnable.
scheduler.schedule(new TimeoutTask(myObjectList), 60, TimeUnit.SECONDS);
我更喜欢使用ScheduledExecutorService
而不是Timer
,因为SchedulerExecutor
可以持有线程池。此外,底层线程池可以用于调用scheduledExecutorService.execute(...)
进行立即并发执行(非计划),使其成为通用执行器设施,而不是专用定时器功能。
在两种情况下,您都需要特别注意安全地从您正在监视的对象中获取超时值。通常,您将使用对象中的同步方法来询问其超时状态。
强制超时
ExecutorService为您提供了一个API,以在给定的超时时间内执行一组任务。例如:
List<Callable<?>> myTasks = ...
// populate myTasks with Callable`s that wrap your intended execution
ExecutorService executorService = ...
List<Future<?>> results = executorService.invokeAll(myTasks, 60, TimeUnit.SECONDS)
在此方法返回后,您可以在给定的时间内询问每个Future是否成功。
CountDownLatch
来实现这个目的。 - gkuzmin