java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的。
大多数停止线程使用Thread.interrupt()方法,但是这个方法不会终止一个线程,还需要加入一个判断才可以完成线程的停止。
下面介绍一下常用停止线程应该使用的方法:
1、interrupt()
Thread.interrupt()方法仅仅设置线程的状态位为中断线程,并不是让线程马上停止,中断线程之后会抛出interruptException异常。
2、Thread.interrupted()
测试当前线程是否已经是中断状态,并且清楚状态。Boolean类型,中断返回true,反之false。当前线程指的是当前方法,并不是启动当前方法的线程。而清楚状态,则是指如果调用两次interrupted()方法,则第二次返回false。
3、Thread.isInterrupted()
测试线程是否已经是是中断状态,但是不清除状态标志。
其实上面的开始我也不理解,经过多次思考,我用自己的话总结一下吧。
1、interrupt()方法仅仅将线程设置为中断状态,但是并不会去停止线程,返回true说明线程的中断状态已经被设置了。
2、
interrupt()、interrupted()和isInterrupted()的具体使用:
interrupt()、interrupted()使用:
public class Test01 extends Thread {
@Override
synchronized public void run() {
super.run();
for (int i = 0; i < 100000; i++) {
//判断线程是否停止
if (this.interrupted()){
System.out.println("已经停止了");
break;
}
System.out.println(i);
}
System.out.println("虽然线程已经停止了,但是还是会跳出for循环继续向下执行的");
}
public static void main(String[] args) {
Test01 test = new Test01();
try {
test.start();
test.sleep(50);
//线程停止
test.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
}
}
打印结果:
3707
3708
3709
3710
3711
已经停止了
虽然线程已经停止了,但是还是会跳出for循环继续向下执行的
使用异常捕获法停止多线程:
当interrupted()检测到线程状态为停止的时候,会抛出异常,继而捕获这个异常来停止多线程
/**
* 使用异常捕获法停止多线程
*/
public class Test01 extends Thread {
@Override
synchronized public void run() {
super.run();
try {
for (int i = 0; i < 100000; i++) {
//判断线程是否停止
if (this.interrupted()) {
System.out.println("已经停止了");
//抛出异常
throw new InterruptedException();
}
System.out.println(i);
}
} catch (InterruptedException e) {
System.out.println("线程结束...");
}
}
public static void main(String[] args) {
Test01 test = new Test01();
try {
test.start();
test.sleep(100);
test.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
}
}
打印语句:
8219
8220
8221
8222
8223
8224
已经停止了
线程结束...