首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以下两种调度和停止线程的方法更好

以下两种调度和停止线程的方法更好
EN

Stack Overflow用户
提问于 2013-02-21 09:51:51
回答 2查看 110关注 0票数 2

我通常看到了两种实现守护进程的方法,该守护进程完成一些工作,然后进入睡眠状态,然后再次醒来。

  1. 而(标志)方法,如果我们想要停止守护进程,则标记为true,如果我们想要停止守护进程,则由其他类设置为false。 同时(标志){//做某事Thread.sleep(10000 L);}
  2. 使用固定延迟的ScheduledThreadPoolExecutor调度。

海事组织,第二种方法更清洁,更容易测试。有人能比较一下这两种方法吗。第一种方法会导致内存问题吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-21 09:57:17

方法2)是推荐的。

方法一对底层线程系统(特别是在UNIX上)的随机唤醒没有鲁棒性,而且您还需要实现自己的错误处理

第二种方法允许您从底层的Thread中抽象,并使用RunnableCallable

此外,方法1)存在时钟漂移问题,即您的任务需要一个非零的时间来执行,因此它将而不是每10秒执行一次。ScheduledExecutorService实际上将每秒钟安排一次执行,如果需要的话,每隔10秒执行一次。

方法2)提供了一种简单的方法来安排线程在一段时间内执行某件事情,并按照javadoc中的示例将其扼杀。

最后,ExecutorSevice更容易关闭自定义线程,只需调用executorService.shutdown(),然后调用executorService.awaitTermination()等待最后一个任务完成。

您可能需要注意的一件事是javadoc中的这个创业板--“如果任务的任何执行遇到异常,随后的执行就会被抑制”。这意味着您必须非常小心地在您的Callable中处理Callable,或者您需要对ScheduledExecutorService进行子类处理(摘自javadoc):

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-02-21 09:58:15

第一种方法会导致内存问题吗?

不是的。最大的问题是如何管理flag变量的可见性。Thread类封装中断标志的概念是有原因的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14999146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档