我试图中断正常运行的线程(不处于sleep()或wait()状态)。
在网上通过我知道中断正常运行的线程只会将标志设置为true并继续该过程。
代码段是
one.java
......
......
actionperformedmethod {
if (actionCmd.equals("cancel")) {
try {
r1.stop(); // to two.java
} catch (InterruptedException ex) {
....
....
}
}
}
two.java
中的
.....
.....
stop method() throws InterruptedException{
if(!(t.isInterrupted())){
t.interrupt();
throw new InterruptedException();
}
}
来自two.java的当我抛出InterruptedException时我能够在one.java上获取异常块,但是如何在此之后停止该线程,因为即使在该线程之后似乎继续正常的过程。
对线程概念不熟悉请帮助..
答案 0 :(得分:4)
interrupt()
方法是合作的而不是先发制人的 - 后台任务需要以适当的时间间隔主动检查Thread.interrupted()
,并采取行动干净地关闭自己。
public void run() {
openSomeResources();
try {
while(notFinished) {
if(Thread.interrupted()) return;
doSomeStuff();
}
} finally {
closeTheResources();
}
}
在此示例中,如果线程在doSomeStuff()
的中间被中断,那么它将在响应中断之前完成当前的“迭代”。在一方面迅速响应中断和另一方面仅在执行中的安全点响应之间获得正确的平衡,这是特定任务的固有特性 - 没有一个尺寸适合 - 所有答案。
但请注意,抛出此异常时,抛出InterruptedException
的任何阻塞方法都将重置中断标志。因此,为了使这种检查工作,您必须在收到InterruptedException
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
// we were interrupted - set the flag so the next interrupted() check will
// work correctly.
Thread.currentThread().interrupt();
}
答案 1 :(得分:1)
中断不会停止线程。它只是将标志设置为true以表示线程很快停止执行。
停止执行 将全局变量添加为
private volatile boolean exit = false;
和 你在第二课中添加一个方法
public void requestExit(){
exit = true;
}
你线程的run ()
内部执行类似这样的操作
if (exit == true){
return;
}
每当你想打电话时,只需从你的main()或你想停止的地方调用此方法requestExit()
这是停止线程的最佳方法..在线程上使用stop()是危险的,因为它不会清除任何资源,因此不建议使用oracle因此不推荐使用。
让我知道任何问题
答案 2 :(得分:0)
线程只在他们的run()
方法在堆栈上时运行,所以通常人们在run方法中放置一个while(true)
,你需要做的所有线程来阻止它是{{1在run方法的某个地方或者打破循环然后只要return
方法不再运行,线程就会停止。