当前位置: 首页 > 知识库问答 >
问题:

停止一个线程/多个线程在崩溃后会对自身调用中断?

慕河
2023-03-14

我目前正在从一个服务运行一个线程来做一些后台工作。现在存在线程崩溃或者我想从服务中断线程的可能性。那我该怎么:

  1. 实际停止线程,(硬)
  2. 捕获异常并调用有关崩溃的服务
  3. 如果在睡眠时中断,则处理InterruptedException()
  4. 线程是否为Thread.IsInterrupted是检测线程是否停止的好方法吗?

到目前为止,我所做的工作如下:

@Override
public void run() {
    try {
        while (!Thread.currentThread().isInterrupted()) {
            doMyBackgroundWork();
            sleep();
        }
    }catch(Exception e){
        ExceptionHandler.logAndSendException(e);
        Thread.currentThread().interrupt();
        if(crashedListener != null){
            crashedListener.onThreadCrashed();
        }
    }
    LOG.i("Thread stops now.");
}

private void sleep() {
    try {
        sleep(frequency);
    } catch (InterruptedException e) {
        //what to do here? it can happen because I stopped it myself 
    }
}

所以一开始我运行我的线程直到它被中断。如果出现任何异常,我想启动一个新线程,因此我的服务实现了一个侦听器接口,一旦抛出异常,我就调用它。我知道不鼓励捕获所有内容,但我需要知道线程是否停止,而不需要一直轮询Thread.isAlive()。

除了我上面的四个问题之外:

  • 我的代码是否可靠,是否符合我的需要?
  • 在线程本身上调用中断可以吗?

谢谢!

共有1个答案

贾成天
2023-03-14

您实际上并没有中断您自己的线程,因为catch块在while循环之外。因此,任何异常都将立即停止执行。

中断本质上只是一个请求(通常来自另一个线程),要求停止做你正在做的事情。线程可以自由地忽略它,并继续做它正在做的事情。通常情况下,您必须抛出一个异常来响应中断,或者以其他方式停止执行,例如从循环中中断(您需要在//what to do here?注释中这样做)。有些库方法是“响应中断”的,这意味着如果线程被中断,它们会抛出异常,例如thread.sleep(),您很可能在sleep调用中使用它。

我推荐在实践中选择Java并发。在优秀的并发材料中,有一章是关于中断的,非常有帮助。

编辑:我会删除你中断自己线程的代码。您还需要将InterruptedException作为运行时异常重新抛出,以脱离执行循环。通常,人们会创建一个扩展RuntimeException的新异常,类似于MyInterruptedException。然后,您可以将它添加到循环周围的catch块中,这样您就可以知道线程何时中断,何时执行失败。

作为一个通用示例,您可以执行如下操作:

public void run() {
    try {
        while (true) {
            // check for interrupts in the loop, or somewhere in the work method
            if (Thread.interrupted()) {
                throw new MyInterruptedException("Important thread interrupted.");
            }
            doMyBackgroundWork();
            sleep();
        }
    }
    catch(Exception e){
        ExceptionHandler.logAndSendException(e);
        if(crashedListener != null){
            crashedListener.onThreadCrashed();
        }
    }
    catch(MyInterruptedException i) {
        LOG.i("Execution stopping because of interrupt.");
    }
}

private void sleep() {
    try {
        sleep(frequency);
    } catch (InterruptedException e) {
        throw new MyInterrptedException(e);
    }
}
 类似资料:
  • 问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下

  • 我在C++中开发了一个状态设计模式,其中我有多个状态。某些状态的线程例程由限定。现在有这样的情况:一个状态转换到另一个状态,因此需要停止线程,并且需要通过清理内存。 因此,总而言之,我需要从线程例程本身停止线程。我怎样才能做到这一点呢? 或者有没有一种方法,当线程例程完成时,内存清理会自动发生? PS:问题是,当我从线程例程进行状态转换到另一个状态时,会调用当前状态析构函数。在当前状态的析构函数中

  • 我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,可以运行用户想要的时间,但最终会在用户发出停止命令时停止。然而,如果其中一个线程突然终止(例如,由于运行时异常),我想停止另一个线程。 现在,这两个线程都执行一个(因此,当我说“stop a thread”时,我的意思是对实例调用一个stop()方法),我想的是避免使用线程(thread类),并使用interface,然后将这两个Runn

  • 我在尝试停止运行多个线程的程序时遇到了问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到了解决方案,所有其他线程都将停止。 在main方法中,我创建了一个线程组,使用for循环向其中添加线程并启动它们 在实现Runnable的类中,我很难找出如何使其实现,以便一旦其中一个线程找到解决方案,所有线程都将停止。最终发生的情况是,要么其他线程继续运行,有时这些线程会相互中断并相互覆盖。

  • 我需要使用两个线程将两个不同的字符附加到同一个JavaFX TextArea。我可以让一个工作,但是当我添加第二个线程时,它会因为一些很长的异常而中断。我做错了什么? 我研究了这个问题以寻求指导,它让我得到了一个线程工作,但不是两个:在两个独立的JavaFx TextArea中显示两个不同线程的输出

  • 问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。