`
zhaoshg
  • 浏览: 256089 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于InterruptedExceptoin

阅读更多

可能会花一些时间,但是可以取消掉

 

   在编写多线程程序时,我们都会习惯去看看方法后是否跟着throws InterruptedException.当方法后面跟着throws InterruptedException时,表示这个方法内可能会抛出InterruptedException异常.

   这通常暗示了我们两个信息:


  1.    这是"需要花费点时间"的方法
  2.    这是"可以取消"

后面接着throws InterruptedExceptoin的方法


   Java中,有三种方法再调用时是必须声明抛出InterruptedException的


  1.      Object类的wait方法
  2.      Thread类的sleep方法
  3.      Thread类的join方法

 

◆需要花费点时间的方法


  1.     执行wait方法的线程,会进入等待区等待被notify/notifyAll.在等待期间,线程是不会活动的!因此需要花费等待notify/notifyAll的时间.
  2.     执行sleep方法的线程,会暂停执行参数内所设置的时间,这也是需要花费时间的.
  3.     执行join方法的线程,需要等待到指定线程结束为止.也是需要花费时间知道指定线程结束为止.

 

◆可以取消的方法


     因为需要花费时间的操作,会降低程序的响应速度,所以我们会希望像下面一样可以在中途放弃执行这个方法.


  1.      取消wait方法等待notify/notifyAll的操作
  2.      取消sleep方法等待设置长度时间的操作
  3.      取消join方法等待其它线程结束的操作

     而恰恰Thraed类中的Interrupt方法就能完成这样的操作.

 

Sleep(),Wait(),Join()分别与Interrupt()的关系

 

Sleep方法与Interrupt方法

  以下面的例子为例

/**<SPAN style="COLOR: #0000ff"> * 模拟线程读取文件
 * @author manming
 *
 */</SPAN>


public class FileThread extends Thread {

	private static Thread waitThread = null;<SPAN style="COLOR: #008000"> //用于保存处于等待状态的线程实例</SPAN>


	
	public void run(){
		if(waitThread !=null){	<SPAN style="COLOR: #008000">// 当等待线程不为空时,中断等待线程</SPAN>


			waitThread.interrupt();
		}else{	<SPAN style="COLOR: #008000">//当等待线程为空时,执行读取操作</SPAN>


			try {
				read();
			} catch (InterruptedException e) {
				System.out.println("线程被中断...");
			}
		}
	}
	public void read() throws InterruptedException{
		<SPAN style="COLOR: #008000">/* 模拟读取文件时出现堵塞,让线程睡眠等待若干时间 */	</SPAN>

	
		waitThread = Thread.currentThread(); <SPAN style="COLOR: #008000">// 保存当前线程为等待线程</SPAN>


		Thread.sleep(10000000);
	}
	
	public static void main(String[] args) {
		
                <SPAN style="COLOR: #008000">//创建两个线程对象</SPAN>


		FileThread  t1 = new FileThread ();
		t1.start();
		FileThread  t2 = new FileThread ();
		t2.start();
	}
}

 上面的例子中,当线程对象t1进入run方法后,首先调用read()方法,t1线程保存为等待线程并进入睡眠状态.此时,如果我们想取消t1线程的等待状态(等待的时间可能无法估计).因为线程t1暂停着,所以取消操作必须由其它线程来执行.因此,我们创建了第二个线程t2,当t2进入run方法后,发现t1被设置为等待线程了,因此调用了waitThread.interrupt();(这里waitThread==t1).要求t1放弃等待操作.

   在这里使用的interrupt方法,是Thread类的实例方法.执行interrupt方法时,不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其它线程的interrupt方法.

   当sleep方法的线程被调用interrupt方法时,就会放弃暂停的状态,并抛出InterruptedException.

 

Wait方法与interrupt方法

 

   同样以上一个例子为例,当t1以wait方法等待时,与sleep一样可以取消.使用interrupt方法,可以对wait中的线程传达"不用等notify/notifyAll了,从等待中出来"的信号.

   但是当线程wait时,有一点需要注意的,那就是锁的问题.线程进入等待状态时,会将自己拥有的锁释放,当对wait中的线程调用interrupt方法是,等待线程会重新获取锁,然后再抛出interruptedException.获取锁定之前,并无法抛出InterruptedException异常.

 

Join方法与interrupt方法

 

   当线程以join方法等待其它线程结束时,一样可以使用interrupt方法取消.因为调用join方法不需要获取锁定.

 

interrupt方法只是改变中断状态而已


   或许有很多人都是这样认为的,当调用了interrupt方法后,目的线程就会抛出InterruptedExceptoin异常,但其实是误解.事实上,interrupt这个方法改变线程的中断状态而已.

   所谓中断状态,是用来表示这个线程有没有被中断的状态.

   当线程A在执行sleep,wait,join时,另一个线程B调用了interrupt方法,的确这个时候线程A会有InterruptedException异常抛出.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException.

   如果线程A正在执行一些复杂的计算,那么,就算此时线程B调用A的interrupt方法,线程A也不会抛出InterruptedException异常,而会继续处理自己后续的操作.当线程执行到sleep,wait,join这些方法,或是没有在线程里自己检查中断状态,自己抛出InterruptedException,那InterruptedException是不会被抛出的.

 

isInterrupted方法 -- 检查中断状态

 

   Thread类的实例方法isInterrupted方法可用来检查指定线程的中断状态.当线程为中断状态时,会返回true;而线程为不是中断状态时,会返回false.isInterrupted不会自己改变中断状态.

 

Thread.interrupted方法 -- 检查并清除中断状态


   而Thread.interrupted方法会检查线程的中断状态,并清除线程的状态.当线程的线程为中断状态时,就返回true,若非中断状态时,则返回false.调用Thread.interrupted方法后,中断状态会被清除.

   除了这个方法以外,没有其它用来清除中断状态的方法.Thread.interrupted方法检查的对象是现在的线程,所以我们无法清除其它线程的中断状态.

分享到:
评论

相关推荐

    2023-04-06-项目笔记 - 第二百六十一阶段 - 4.4.2.259全局变量的作用域-259 -2025.09.19

    2023-04-06-项目笔记-第二百六十一阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.259局变量的作用域_259- 2024-09-19

    采用Spring+Struts2+Hibernate框架,实现一个仿天猫购物网站的web工程(毕设&课设&实训&大作业&竞赛&项

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    人工智能赋能数据中心的绿色节能策略

    本文阐述了人工智能在数据中心节能应用领域的理论与实践,通过介绍机器学习和基于物理机理模型的人工智能节能技术的应用情况,展示了如何利用AI技术来提升数据中心能源效率,减少PUE。并指出基于大数据分析的智能运维方法能优化数据中心冷却系统的运行状态,从而达成绿色节能目的;同时也强调了未来的节能系统发展趋势及标准化推进措施等重要方向。 适用人群:数据中心管理人员,环保工作者,信息和通信技术行业的专业人士。 使用场景及目标:适用于那些希望利用AI和其他技术优化其数据中心效能的企业;通过技术手段达到减少能耗、提升工作效率的目的。 其他:随着全球对环境友好技术的关注增加,在数据中心的建设和运维过程中融合AI等新技术已经成为必然趋势。

    基于java的网上球鞋竞拍系统设计与实现.docx

    基于java的网上球鞋竞拍系统设计与实现.docx

    C语言入门教程.zip

    【c语言入门】 静态库、动态链接库、include、makefile、io、文件操作函数、管道原理及应用、简单的数据结构

    基于java中药分类管理系统设计与实现.docx

    基于java中药分类管理系统设计与实现.docx

    基于频谱旋转ωk算法大斜视SAR动目标成像

    内容概要:文中针对大斜视SAR系统在动目标成像上遇到的各种问题,包括聚焦难、几何变形和交叉副瓣高等挑战,采用了一个融合了频谱旋转和稀疏化增强处理方式的新颖算法——频谱旋转ωk算法,进行了详细讨论并提供了一套完整解决方案。 适用人群:该研究对于SAR技术研究专家、学者、工程师有着特别的实际意义与价值。 使用场景及目标:本成果可应用于斜视角达到甚至超过七十度的高斜度SAR动目标成像系统中,提升动目标检测、定位、识别等能力。具体应用场景涵盖了战场态势监测、交通流量监管等多个领域。 本文通过详细的理论建模及仿真实验结果论证算法的有效可行性;此外,文中提及了未来在更高动态环境下SAR成像领域的扩展可能性。

    基于java的新闻发布系统设计与实现.docx

    基于java的新闻发布系统设计与实现.docx

    基于java的应急资源管理系统设计与实现.docx

    基于java的应急资源管理系统设计与实现.docx

    基于java的斗车交易系统设计与实现.docx

    基于java的斗车交易系统设计与实现.docx

    通感一体化在车联网中的应用前景与关键技术

    主要内容:文章探讨了随着6G通讯技术发展,将通感一体化应用于车联网的可能性及其带来的显著效果,尤其是在辅助自动驾驶、多车合作感知与控制、车路通感融合发展中的应用。通过阐述各方面的技术框架和细节(如波束管理和智能反射面技术),文中指出了车联网系统在实现高效率、安全性以及智能化管理上的关键突破。同时强调在实施中遇到诸如频带分配、信号混迭、硬件整合等现实挑战,并提出了未来发展方向。 适用人群:研究人员和开发人员,特别是从事车联网和新一代通讯技术支持的专业人士。 使用场景及目标:适用于车联网的研究和开发,目的是构建高效的交通通信系统,在实际使用中促进自动驾驶、智能交通管理系统等新技术落地,提高道路通行的安全性和效率。 相关背景与建议:本文对通感一体化的技术介绍深入浅出,并讨论了一系列技术前沿,包括智能反射技术的最新成果。阅读者应掌握一定的无线通讯基础知识,并能理解技术理论在工程实践里的潜在机遇与难题。

    #_ssm_156_mysql_高校设备管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    #_ssm_098_mysql_个性化电子相册设计_.zip

    均包含代码,文章,部分项目包含ppt

    2019李宁跑步自媒体年度内容运营方案.pptx

    2019李宁跑步自媒体年度内容运营方案.pptx

    基于java的中国咖啡文化宣传网站的设计与实现.docx

    基于java的中国咖啡文化宣传网站的设计与实现.docx

    基于java的学生考勤管理设计与实现.docx

    基于java的学生考勤管理设计与实现.docx

    安卓开发:探索移动应用的无限可能

    安卓开发:探索移动应用的无限可能

    34521945-b0e9-461e-8b69-6436502dee5b-1.zip

    34521945-b0e9-461e-8b69-6436502dee5b-1.zip

    基于Servlet+JSP+JDBC的完整的用户信息操作-CRUD项目总结

    完整的项目源码(注意更换自己的数据库名,并且字段设置要一样)

    该GUI程序计算车轮与轨道接触时的一些具体数据.zip

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

Global site tag (gtag.js) - Google Analytics