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标志,这可能会导致