线程管理之线程停止一
1.1线程停止
线程停止描述:停止一个线程意味着在线程处理完任务之前停掉正在执行的操作,也就是放弃当前的操作。
java 终止正在运行线程的三种方法:
1、使用退出标志,使线程正常退出,也就是run方法完成后线程终止。
2、使用stop方法强行终止线程,但是不推荐使用这个方法,因为stop和suspend及resume方法一样,都是作废过期的方法,使用它们可能产生无法预料的结果。
3、使用interrupt方法终止线程。
我们根据java 终止正在运行线程的方法,来一步步验证。
本案例:通过interrupt()方法,实现终止线程执行
package com.zzg.thread;
public class ThreadDemo3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadObj2 obj = new ThreadObj2();
Thread thread = new Thread(obj);
thread.start();
// 使用线程interrupt 方法终止线程运行
thread.interrupt();
System.out.println("正在执行线程,已经调用interrupt方法");
}
private static class ThreadObj2 implements Runnable {
@Override
public void run() {
// 简单for循环遍历
for(int i=0;i<1000;i++){
System.out.println("current i is"+i);
}
}
}
}
运行截图:
理论分析:本案例通过调用线程的interrupt()方法来停止正在执行的线程,但效果并不像for+break 那样,马上停止线程的运行。调用interrupt()方法仅仅是在当前的执行线程做一个停止标记,并不是真的马上停止线程执行。如何才能停止线程执行?
1.2 线程停止状态
在介绍如何停止线程之前,我们先看一下,如何判断线程的状态是不是停止状态。在JDK 1.6中,Thread.类提供了两种判断线程状态的方法。
thread.isInterrupted()和Thread.interrupted()方法之间的共同与差异?
共同点:thread.isInterrupted()和Thread.interrupted()都返回当前线程的“interrupt”状态。
差异点:thread.isInterrupted()方法是“实例方法”,Thread.interrupted()方法是"静态方法"
注意:Thread.interrupted()会把当前线程的interrupt状态“复位”,假设当前线程的isInterrupt状态为true,它会返回true,但过后isInterrupt的状态会复位为false。之后调用(Thread)t.isInterrupt或Thread.interrupted都会返回false
现在我们开始来验证一下,Thread.interrupted()方法,是否能够实现“interrupt”状态复位?
本案例:主要是通过main主线程,来分析Thread.interrupted()的状态复位问题。
package com.zzg.thread;
public class ThreadDemo4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//输出当前线程名称
System.out.println("current Thread name is:"+Thread.currentThread().getName());
//当前线程中断操作:interrupt()方法
Thread.currentThread().interrupt();
System.out.println("current Thread's State is:"+Thread.interrupted());
System.out.println("current Thread's State is:"+Thread.interrupted());
}
}
运行截图:
thread.isInterrupted()和Thread.interrupted()方法总结:
1、this.interrupted():测试当前的线程是否已经是中断状态,执行后,具有将中断状态标志清除为false的功能。
2、this.isInterrupted():测试当前的线程对象是否已经中断,但不清楚中断状态标志。
本案例:通过thread.interrupt()方法和thread.isInterrupted()方法,来实现一个简单中断线程Demo
package com.zzg.thread;
public class ThreadDemo3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ThreadObj2 obj = new ThreadObj2();
obj.start();
// 使用线程interrupt 方法终止线程运行
Thread.sleep(100);
obj.interrupt();
System.out.println("正在执行线程,调用interrupt方法完毕");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static class ThreadObj2 extends Thread {
@Override
public void run() {
// 简单for循环遍历
for (int i = 0; i < 10000; i++) {
//添加判断中断状态条件
if (this.isInterrupted()) {
System.out.println("当前线程的中断状态为:"+this.isInterrupted());
break;
}
System.out.println("current i is" + i);
}
}
}
}
运行截图:
结论:本案例通过在for循环语句中来判断线程是否是停止状态,如果是停止状态,则跳出for循环,则后面的代码无法执行,如果是非停止状态,则继续执行for循中的相关逻辑代码。
理论深究:通过刚刚上一个案例,实现了一个简单的线程停止,但是如果我们在for循环,后面追加一段代码,在线程调用interrupt()方法时,for循环的代码肯定会终止,但是我们刚刚追加的代码会终止吗?
package com.zzg.thread;
public class ThreadDemo3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ThreadObj2 obj = new ThreadObj2();
obj.start();
// 使用线程interrupt 方法终止线程运行
obj.interrupt();
System.out.println("正在执行线程,调用interrupt方法完毕");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static class ThreadObj2 extends Thread {
@Override
public void run() {
// 简单for循环遍历
for (int i = 0; i < 10000; i++) {
// 添加判断中断状态条件
if (this.isInterrupted()) {
System.out.println("当前线程的中断状态为:" + this.isInterrupted());
break;
}
System.out.println("current i is" + i);
}
System.out.println("我是追加代码片段");
}
}
}
运行截图:
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。