Java并没有提供真正中断线程的方法,<font color=red>中断线程最好的方法就是让线程执行完成自然终止</font>,stop(),suspend(),resume()等方法会导致不安全或者死锁等问题,均已经废弃。
有两种方法中断线程,一种为通过自定义变量设置退出标志,一种通过interrupt方法,本质没有区别。<font color=red>但是第二种方式可以处理阻塞中的线程,推荐使用。</font>
第一种:通过自定义变量设置退出标志,让线程自然终止
public class ThreadFlag extends Thread {
public boolean exit = false;
public void run() {
while (!exit) {
System.out.println("我是子线程,我在执行");
}
}
public static void main(String[] args) throws Exception {
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主线程延迟5秒,看效果
thread.exit = true; // 终止线程thread
thread.join();
System.out.println("线程退出!");
}
}
这种开关的方式使用大部分情况,但是当遇到线程阻塞时,就没有办法了会一直卡在那,如下面的示例代码。
public class ThreadFlag extends Thread {
public boolean exit = false;
public void run() {
while (!exit) {
try {
sleep(1000_000);//
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是子线程,我在执行");
}
}
public static void main(String[] args) throws Exception {
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主线程延迟5秒,看效果
thread.exit = true; // 终止线程thread
thread.join();
System.out.println("线程退出!");
}
}
第二种:使用线程的interrupt方法
这种方法不会真正停止线程,需要自己根据interrupted标志自行处理让线程自然结束,相比于第一种方式有一个好处就是可以处理阻塞中的线程,它可以迅速中断被阻塞的线程,抛出一个InterruptedException,把线程从阻塞状态中释放出来,第一种则不行。
public class ThreadInterrupt extends Thread {
public void run() {
while (!isInterrupted()) {//判断结束标志
try {
sleep(1000_000);//
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
System.out.println("我是子线程,我在执行");
}
}
public static void main(String[] args) throws Exception {
ThreadInterrupt thread = new ThreadInterrupt();
thread.start();
sleep(5000); // 主线程延迟5秒,看效果
thread.interrupt();
thread.join();
System.out.println("线程退出!");
}
}
网友评论