Java Thread.interrupt真的会停止程序执行吗?
我正在使用Java Thread.interrupt真的会停止程序执行吗?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我正在使用线程停止线程执行。中断,但线程执行不会停止。它还在运行 例如: Thread t = new Thread(new Runnable() { @Override public void run() { int i = 0; while(i<10000){ if(Thread.currentThread()
线程停止线程执行。中断
,但线程执行不会停止。它还在运行
例如:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(i<10000){
if(Thread.currentThread().isInterrupted()){
System.out.println("Thread Interrupted but it still running");
}
System.out.println(++i);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
t.interrupt();
Thread t=新线程(new Runnable(){
@凌驾
公开募捐{
int i=0;
while(i它只设置标志,除非当时正在执行可中断语句(例如sleep、wait)。现在您应该能够通过处理这两种情况来解决如何停止线程
我无法检查线程。isInterrupted()然后如果线程被中断
打破循环,我不能这么做
为什么不呢
例如
while(iThread.interrupt()将真正中断一个实际检查该状态的操作(例如,一个可中断的i/O操作,或者一些用户代码明确检查isInterrupted(),原则上就像您在引用的代码中所做的那样)
在您引用的具体示例中,您需要记住:
- 每个处理器核心以数十亿条指令的顺序执行
每秒
- 进程切换以十到数百的顺序发生
每秒的次数
换句话说,将计数器递减10000次的任务发生得如此之快,以至于无论出于何种目的,它都不会被注册为“可中断任务”。实际上,在另一个线程调用interrupt()之前,所有10000次递减都会发生如果线程在等待、睡眠或加入时被阻塞,则会抛出InterruptedException,否则会设置interrupted状态
如果调用Thread.Interrupted,中断状态将被清除
Thread.isInterrupted不清除中断状态
如果设置了线程的中断状态,并且该线程调用wait、sleep或join,则会清除中断状态并抛出InterruptedExcepion
我的疑问是Thread.interrupt只是设置interrupted标志,或者它真的停止了执行
它执行前者…或者在某些情况下抛出“中断”异常
如何停止线程执行或终止正在运行的线程
一般来说,您无法安全地停止或杀死未检查其中断标志的正在运行的线程。thread
类上有一些已弃用的方法,但您应该避免使用它们,因为它们显然不安全。(要理解为什么线程方法是javadocs…以及它链接到的常见问题解答。)可能重复:还请记住,在上述代码中,在检测到中断时确实需要中断循环。中断将导致isInterrupted()返回true(一次)或者导致睡眠被中断异常唤醒,但仅此而已。如果由于中断,您希望打破循环,那么您需要明确地这样做。尼尔谢谢。我只是给出了示例场景。这不是我面临的真实场景。对于您的观点,我们要检查线程.isinterrupted
,并停止e所以…看看这里线程中断的一般性,否则,除非你能暴露出你所遇到的实际问题,否则很难做出回应。。。!
while(i<10000){
if(Thread.currentThread().isInterrupted()){
System.out.println("Thread Interrupted but it still running");
return; // HERE
}
System.out.println(++i);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
return; // HERE
}
}