线程管理之线程停止一

小虾米 阅读:633 2021-03-31 22:22:57 评论:0

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.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号