Java whilestop线程出现问题

Java whilestop线程出现问题,java,multithreading,Java,Multithreading,我正试图阻止一个线程。停止线程时,线程被异常中断 如果线程抛出中断异常,我可以做什么。我应该抓住它什么也不做还是我需要做什么?你不应该“停止”一条线。我主要做的事情是在线程的类中创建一个公共(可能是静态)变量,用于指示线程何时停止。这就像是一份 public volatile bool shouldStop = false; 然后,在线程的每个周期结束时,您可以检查是否需要退出(中断while循环或其他) 线程处理起来非常烦人!仅在线程本身上调用中断/停止函数是可能的,但大多数情况下是不需要的

我正试图阻止一个线程。停止线程时,线程被异常中断


如果线程抛出中断异常,我可以做什么。我应该抓住它什么也不做还是我需要做什么?

你不应该“停止”一条线。我主要做的事情是在线程的类中创建一个公共(可能是静态)变量,用于指示线程何时停止。这就像是一份

public volatile bool shouldStop = false;
然后,在线程的每个周期结束时,您可以检查是否需要退出(中断while循环或其他)


线程处理起来非常烦人!仅在线程本身上调用中断/停止函数是可能的,但大多数情况下是不需要的。

您不应该“仅停止”线程。我主要做的事情是在线程的类中创建一个公共(可能是静态)变量,用于指示线程何时停止。这就像是一份

public volatile bool shouldStop = false;
然后,在线程的每个周期结束时,您可以检查是否需要退出(中断while循环或其他)

线程处理起来非常烦人!仅在线程本身上调用中断/停止函数是可能的,但大多数是不需要的。

这是有原因的。stop()和.suspend()被弃用,不应使用。本条涉及:

我还引用了Javadocs:

不赞成。这种方法具有内在的优越性 不安全的。停止线程 Thread.stop使其解锁所有线程 它已锁定的监视器(作为 未经检查的自然后果 ThreadDeath异常正在向上传播 堆栈)。如果有任何对象 以前受这些监视器保护 处于不一致的状态时 损坏的物体变得对人可见 其他线程,可能导致 以武断的行为。多种用途 stop应替换为以下代码: 简单地修改一些变量以 指示目标线程应该 别跑了。目标线程应该 定期检查此变量,并 在 如果变量 表示要停止运行。 如果目标线程等待很长时间 周期(在条件变量上,例如 例如),中断方法应 用于中断等待。对于 更多信息,请参见为什么 Thread.stop、Thread.suspend和 Thread.resume已弃用

您应该找到某种方法(通过某些共享变量或其他方式)来同步线程,以便线程可以自行结束。

这是有原因的。stop()和.suspend()被弃用,不应使用。本条涉及:

我还引用了Javadocs:

不赞成。这种方法具有内在的优越性 不安全的。停止线程 Thread.stop使其解锁所有线程 它已锁定的监视器(作为 未经检查的自然后果 ThreadDeath异常正在向上传播 堆栈)。如果有任何对象 以前受这些监视器保护 处于不一致的状态时 损坏的物体变得对人可见 其他线程,可能导致 以武断的行为。多种用途 stop应替换为以下代码: 简单地修改一些变量以 指示目标线程应该 别跑了。目标线程应该 定期检查此变量,并 在 如果变量 表示要停止运行。 如果目标线程等待很长时间 周期(在条件变量上,例如 例如),中断方法应 用于中断等待。对于 更多信息,请参见为什么 Thread.stop、Thread.suspend和 Thread.resume已弃用


您应该找到某种方法(通过共享变量或其他方式)来同步线程,以便线程可以自行结束。

这取决于您的需要。您可以(例如)执行以下操作:

public void run() {
    try {
         // do thread stuff
    } catch(ThreadInterruptedException ex) {
         // close gracefully what needed to be closed
    }
}

但是这个。因此,更好的解决方案是放置一些布尔变量来指示线程是否应该停止,并提供一种方法来更改它以停止线程(例如,请参见)。

这取决于您的需要。您可以(例如)执行以下操作:

public void run() {
    try {
         // do thread stuff
    } catch(ThreadInterruptedException ex) {
         // close gracefully what needed to be closed
    }
}

但是这个。因此,更好的解决方案是放置一些布尔变量来指示线程是否应该停止,并提供一种方法来更改它以停止线程(请参见示例)。

我的第一反应是“它的依赖项”。请提供更多的背景知识?看看Brian Goetz的这篇文章“这取决于”是我的第一反应。请提供更多的上下文?看看Brian Goetz的这篇文章这是一个很好的观点,但我认为OP没有使用.stop()。否则,他们就不会得到InterruptedException。这是一个很好的观点,但我认为OP没有使用.stop()。否则,他们不会得到InterruptedException。对我来说,只检查线程的中断状态(即
thread.currentThread().isInterrupted()
)更有意义。最好将其设置为易失性布尔值。为什么不需要调用中断?这是中断等待线程的适当机制。如果代码抛出InterruptedException,那么它就是阻塞了某些东西。取消阻塞的唯一方法是中断线程。如果这是一个将超时或完成的操作,那么代码必须等待超时或完成,然后才能检查shouldStop标志(我可能不接受),只检查线程的中断状态(即
thread.currentThread().isInterrupted()
)最好将其设置为易失性布尔值。为什么不需要调用中断?这是中断等待线程的适当机制。如果代码抛出InterruptedException,那么它就是阻塞了某些东西。取消阻塞的唯一方法是中断线程。如果这是一个将超时或完成的操作,那么代码必须等待超时或完成,然后才能检查shouldStop标志,这可能会导致