方法2)被推荐。
方法之一不是由基础线程系统(尤其是在UNIX上)强大的随机觉醒,你也需要实现自己的错误处理
方法有两个可以让你从底层的Thread
和工作与Runnable
或Callable
。
而且方法1)具有时钟漂移的问题,即你的任务需要一个非零时间,因此执行将不执行每十秒钟。 ScheduledExecutorService
实际上会每秒执行一次执行,或者如果需要,每十秒钟执行一次执行。
方法2)提供了一种简单的方法来安排线程在一段时间内执行某些操作,并按照javadoc中的示例将其杀死。
最后,ExecutorSevice
更容易关闭自定义线程,只需调用executorService.shutdown()
然后executorService.awaitTermination()
即可等待最后一个任务完成。
您可能需要注意的一件事是javadoc中的这个gem - “如果任务的任何执行遇到异常,则后续执行被取消”。这意味着要么你必须非常小心你的Callable
try/catch
或者你需要这样子类ScheduledExecutorService
(从javadoc中获取):
public class MyScheduledExecutor extends ScheduledThreadPoolExecutor {
public MyScheduledExecutor(int corePoolSize) {
super(corePoolSize);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null) {
System.out.println(t);
}
}
}
+1好点。除了最后一段不适用,因为OP对固定延迟而不是固定费率的调度方案感兴趣。 – 2013-02-21 10:09:17