【问题标题】:How to avoid disorder when calling future.cancel()?调用future.cancel()时如何避免混乱?
【发布时间】:2018-12-07 20:51:41
【问题描述】:

事情就是这样。

首先,我在 java 中有一个线程池(例如,一个线程池有 8 个线程)。

其次,我还有一个监控线程,通过future.cancel()方法限制这个池中每个线程的执行时间不能大于5分钟。

但是,我在以下情况下发现了潜在的障碍。

假设,该池中的线程 t1 已执行超过 5 分钟,并且监控线程已观察到这种情况。 同时,线程 t1 完成了当前的计算任务,并接受了另一个新的计算任务;监听线程调用future.cancel()向线程t1发送中断信号。

不幸的是,线程 t1 检查了它的中断信号并取消了这个新任务,这不是我们的预期。

问题是如何避免这种情况?有什么建议吗?

【问题讨论】:

  • 你如何衡量执行时间?
  • @shmosel,监听线程调用getThreadCPUTime(id)获取特定线程的执行时间,例如线程t1的id为2,那么监听线程会调用getThreadCPUTime(2)。
  • 如果您要测量单个任务的执行时间,为什么要这样做?还是我误解了要求?
  • @shmosel 是的!我想你是对的。我可以在线程 t1 的检查点检查 (thread.interrupt() && thread execution time > 5 min)。我只是厌倦了java的“软”中断机制。

标签: java multithreading timeout threadpool


【解决方案1】:

似乎您需要某种“原子”取消任务。但是我不知道这是否可行,所以我有另一个想法:

你可以反转逻辑,所以 Monitor 会检查执行时间,然后在线程中设置某种“标志”。并且线程可以在它的任务执行逻辑中检查这个标志。

【讨论】:

  • 另外,尝试获取您的问题案例的一些指标。这是您应用中的真实情况吗?
  • 是的,我在我的应用程序中遇到了一个真正的问题。但我不确定根本原因是否是这个并发错误。此外,您还谈到了“旗帜”。实际上,Java 使用相同的方式通过写入和读取名为“interrupt”的标志来停止线程,我已经在我的应用程序中使用过。
猜你喜欢
  • 2021-04-13
  • 2011-06-28
  • 1970-01-01
  • 2021-02-28
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多