3

我有以下问题,如果我在java中中断一个线程,一个正在运行15分钟的进程,它会停止进程,停止方法还是完成这个过程,并且不允许其他人继续排队?

我有一个“线程”,它将调用一个方法,该方法将在插入 postgres 后进行基于比较的“访问”和“postgres”,如果我想停止调用此操作的线程,她将成功停止进程,还是等他们完成?

4

3 回答 3

3

当您“中断”一个线程时,它会执行以下三件事之一(在幕后可能是同一件事):

  • 如果线程当前正在等待、休眠或加入另一个线程,则中断将导致InterruptedException目标线程中抛出一个。
  • 如果线程在“可中断 I/O”(即对 的实现上的操作InterruptibleChannel)等待时被阻塞,ClosedByInterruptException则会抛出 a。
  • 如果它没有做这些事情之一,那么将在线程上设置一个标志。线程可以通过调用来检查该标志Thread.interrupted()(这将立即重置标志)......但如果没有,下一次调用any_object.wait()Thread.sleep()any_thread.join()可能还有某些其他阻塞方法,将引发异常。

当然,所有这些异常都是经过检查的异常......这几乎总是意味着附近会有一个异常处理程序(除非代码被设计为可中断的,否则通常会忽略异常并再次尝试操作)。如果线程从不等待,并且从不检查中断标志,那么中断它不会有太大作用。

此外,如果线程当前正在等待 JVM 无法控制的内容,则中断可能不会产生任何影响。在某些平台上(想到 Windows),Java 很难中断本机代码。

所有这些警告可以总结为:如果你想要杀死一个不守规矩的线程,这可能不是这样做的方法。事实是,没有一种体面的方法可以在不让进程处于潜在古怪状态的情况下杀死线程。在这种情况下,您通常想要的是一个单独的进程,如果它失控,您可以终止它。

于 2013-08-23T19:49:36.153 回答
3

它不会停止线程,除非其中执行的方法在收到“中断”信号时愿意终止。抛出 InterruptedException 的方法通常属于这一类。当然,调用链中的所有方法都需要以一种或另一种方式协作。

如果您的代码没有调用“可中断”方法或有部分长时间不调用它们,那么让它们Thread.isInterrupted()定期检查标志,并在它变成true. 如果您曾经收到(并抓住,您应该收到)同样的事情InterruptedException

但是,如果您的意图更具体,您的问题可以得到改进。我正要解释“线程中断”协议是如何工作的,但也许这不是您想要的。

于 2013-08-23T19:38:07.350 回答
2

来源: -

中断是对线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的。这是本课强调的用法。线程通过在 Thread 对象上调用中断来发送中断,以使线程被中断。为了使中断机制正常工作,被中断的线程必须支持自己的中断。

于 2013-08-23T19:32:31.330 回答