Java 调用future.cancel()时如何避免混乱?

Java 调用future.cancel()时如何避免混乱?,java,multithreading,timeout,threadpool,Java,Multithreading,Timeout,Threadpool,事情是这样的 首先,我有一个java线程池(例如,一个线程池有8个线程) 其次,我有另一个监视器线程,通过future.cancel()方法限制此池中每个线程的执行时间不能超过5分钟 然而,在下面的情况下,我发现了一种潜在的紊乱 假设此池中的线程t1已执行5分钟以上,并且监视线程已观察到这种情况。 同时,线程t1完成了当前的计算任务,并接受了另一个新的计算任务;监视器线程调用future.cancel()将中断信号发送到线程t1 不幸的是,线程t1检查其中断信号并取消这个新任务,这不是我们的期望

事情是这样的

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

其次,我有另一个监视器线程,通过future.cancel()方法限制此池中每个线程的执行时间不能超过5分钟

然而,在下面的情况下,我发现了一种潜在的紊乱

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

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


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

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


您可以反转逻辑,所以监视器将检查执行时间,然后在线程中设置某种“标志”。线程可以在其任务执行逻辑中检查此标志。

此外,尝试获取问题案例的一些指标。这是你的应用程序中的真实情况吗?是的,我在我的应用程序中遇到了一个真实的问题。但我不确定根本原因是否是这个并发错误。此外,你还提到了“国旗”。实际上,Java使用相同的方法通过写入和读取我在应用程序中已经使用过的名为“中断”的标志来停止线程。您如何测量执行时间?@shmosel,monitor thread调用getThreadCPUTime(id)来获取特定线程的执行时间,例如,线程t1的id为2,然后monitor thread将调用getThreadCPUTime(2)。如果您试图测量单个任务的执行时间,为什么要这样做?还是我误解了这个要求?@shmosel是的!我认为你是对的。我可以在线程t1的检查点中检查(thread.interrupt()&&线程执行时间>5分钟)。我只是厌倦了java的“软”中断机制。