大多数停止一个线程的操作方法是Thread.interrupt();方法,尽管方法的名称是“停止,终止”的意思,但这个方法不会终止一个正在运行的线程,还需要加一个判断才可以完成线程的停止。
在Java中有以下3种方法可以终止正在运行的线程:
(1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
(2)使用stop方法强行终止线程,但是不推荐使用这种方法,因为stop和suspend及resume一样,
都是作废过期的方法,使用它们可能产生不可预料的结果。
(3)使用interrupt方法中断线程。
this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态设置清楚为false的功能。
this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志。
this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志。
下面只讨论interrupt方法中断线程。
方法一
package thread;
public class Main {
public static void main(String []args)
{
MyThread myThread = new MyThread();
myThread.start();
try {
Thread.sleep(2000);
myThread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
package thread;
public class MyThread extends Thread {
@Override
public void run() {
super.run();
for(int i = 0;i<500000;i++) {
System.out.println(i);
if(this.interrupted()){
System.out.println("线程已经停止");
break;
}
}
}
}
上面代码的处理只是通过break跳出了for循环,若for循环后面还有代码,后面的代码还是会运行,所以该方法并不能停止线程。
方法二(通过异常法来停止线程)
package thread;
public class MyThread extends Thread {
@Override
public void run() {
super.run();
try {
for(int i = 0;i<500000;i++) {
System.out.println(i);
if(this.interrupted()){
System.out.println("线程已经停止");
throw new InterruptedException("抛出线程异常");
}
}
System.out.println("如果此代码被输出,则线程未停止");
}catch (InterruptedException e){
System.out.println(e.getMessage());
}
}
}
还可以在沉睡中停止线程
package thread;
public class MyThread extends Thread {
@Override
public void run() {
super.run();
try {
System.out.println("run -- begin");
Thread.sleep(5000);
System.out.println("run -- end");
}catch (Exception e) {
System.out.println("线程在沉睡中被停止");
}
}
}
如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态,使之变成false。