栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将代码从使用计时器移植到Scheduledexecutorservice

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将代码从使用计时器移植到Scheduledexecutorservice

注意:您执行此操作的方式将泄漏线程!

如果您的课程

B
将保留下来,并且 每个实例 最终 将被关闭或关闭或释放,那么我将这样做:

class B {  final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);  public boolean execute() {    try {      scheduler.scheduleWithFixedDelay(new BRunnnableTask(), period, delay);      return true;    } catch (Exception e) {      return false;    }  }  public void close() {    scheduler.shutdownNow();  }}

如果您不会在每个实例上进行这种清理,那么我会这样做:

class B {  static final ScheduledExecutorService SCHEDULER = Executors.newCachedThreadPool();  public boolean execute() {    try {      SCHEDULER.scheduleWithFixedDelay(new BRunnnableTask(), period, delay);      return true;    } catch (Exception e) {      return false;    }  }}

ExecutorService
您在代码中分配的每个分配都会分配一个
Thread
。如果您制作了很多类实例,
B
则每个实例都会分配一个
Thread
。如果这些不能迅速收集到垃圾,那么您可能最终会分配成千上万个线程(但未使用,只是分配了),并且可能使整个服务器崩溃,使机器上的每个进程都挨饿,而不仅仅是您自己的JVM。我已经看到它在Windows上发生,并且我希望它也可以在其他OS上发生。

当您不打算在单个对象实例上使用生命周期方法时,静态缓存线程池通常是一种安全的解决方案,因为您只会保留实际 运行的
线程数,而不会为创建的每个实例分配一个线程尚未收集垃圾。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438936.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号