我通常看到了两种实现守护进程的方法,该守护进程完成一些工作,然后进入睡眠状态,然后再次醒来。
海事组织,第二种方法更清洁,更容易测试。有人能比较一下这两种方法吗。第一种方法会导致内存问题吗?
谢谢
发布于 2013-02-21 09:57:17
方法2)是推荐的。
方法一对底层线程系统(特别是在UNIX上)的随机唤醒没有鲁棒性,而且您还需要实现自己的错误处理
第二种方法允许您从底层的Thread中抽象,并使用Runnable或Callable。
此外,方法1)存在时钟漂移问题,即您的任务需要一个非零的时间来执行,因此它将而不是每10秒执行一次。ScheduledExecutorService实际上将每秒钟安排一次执行,如果需要的话,每隔10秒执行一次。
方法2)提供了一种简单的方法来安排线程在一段时间内执行某件事情,并按照javadoc中的示例将其扼杀。
最后,ExecutorSevice更容易关闭自定义线程,只需调用executorService.shutdown(),然后调用executorService.awaitTermination()等待最后一个任务完成。
您可能需要注意的一件事是javadoc中的这个创业板--“如果任务的任何执行遇到异常,随后的执行就会被抑制”。这意味着您必须非常小心地在您的Callable中处理Callable,或者您需要对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);
}
}
}发布于 2013-02-21 09:58:15
第一种方法会导致内存问题吗?
不是的。最大的问题是如何管理flag变量的可见性。Thread类封装中断标志的概念是有原因的。
https://stackoverflow.com/questions/14999146
复制相似问题