如何以一定的时间间隔运行Java线程,并在超过时间限制时取消它?

eivnm1vs  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(207)

我试图设计一个系统,通过它我可以有一个线程执行在一定的时间间隔(例如。10秒),并且如果它超过时间限制(例如,10秒),则还在某个时间取消它。5秒)。也许这不是正确的方式来做什么,我正在寻找,但我喜欢一些帮助,尽管如此。
我考虑过使用ExectuorService来执行此操作,但我会遇到问题吗?

x9ybnkn6

x9ybnkn61#

使线程以特定的时间间隔执行(例如,10秒)

你可以

使用ScheduledExecutorService在指定的时间段内重复执行任务。
这已经在Stack Overflow上广泛讨论过了。搜索以了解更多信息。
如果超过时间限制,则在某个时间取消(例如,5秒)。

你不能

Java没有提供强制停止线程执行的方法。
Java并发只允许协作取消。您可以通过“中断”来表示您要停止另一个线程。但是这个中断尝试仅仅设置一个标志,如果线程处于睡眠状态,则唤醒线程。必须对任务进行编码,以便定期查找中断标志。如果设置了flag,则必须对任务进行编码,然后👉结束其自身的执行。
这一点在Stack Overflow上也有广泛的介绍。搜索以了解更多信息。

b1payxdu

b1payxdu2#

你的方向是对的你完全可以用ExecutorService做到这一点。您可以使用awaitTermination()并设置一个超时,检查isTerminated()线程是否已经完成(在shutdown()之后),并请求终止任何尚未终止的线程。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

jq6vz3qz

jq6vz3qz3#

首先阅读这篇文章:
如何在给定Future对象的情况下中断线程?
你需要确保的主要事情是,当线程被中断时,你的线程负责任地行动
换句话说,你的代码的责任是为任何中断做好准备。我想说的是,无论何时你有一个长时间运行的任务,你都应该插入一些像这样的中断准备代码:

while (... something long...) {

     ... do something long

     if (Thread.interrupted()) {
         ... stop doing what I'm doing...
     }
}

如果你的代码经常检查Thread.interrupted,并且正确处理了InterruptedExceptions(例如:它会停止线程循环),就像这样:

private void someMethodDeepDown() {
    while (.. long running task .. ) {
          try {
              ... do lots of work ...
    
          // or just let it propagate up!
          } catch (InterruptedException e) {
             // oh no! an interrupt! 
             Thread.currentThread().interrupt();
             throw new StopTheThreadRuntimeException(...);
          }
     }
}

这将使您的线程可中断。然后就是跟踪每个线程的问题了,当它超过分配的时间时,可以调用Thread.interrupt(),它就会死亡。

大警告

不幸的是,有许多库不能正确处理InterruptedException,只是抑制它,或者在长时间运行的任务中不检查Thread.interrupted()。
因此,除非您完全控制线程的代码,否则无法保证线程会很快死亡。

相关问题