小妖女 发表于 2015-1-18 11:02:29

发布一篇Java中止机制详解

最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的
1.弁言
当我们点击某个杀毒软件的作废按钮来中断查杀病毒时,当我们在把持台敲进quit命令以停止某个背景服务时……都必要经由过程一个线程往作废另外一个线程正在实行的义务。Java没有供应一种平安间接的办法来中断某个线程,但是Java供应了中止机制。
假如对Java中止没有一个周全的懂得,大概会误觉得被中止的线程将立马加入运转,但事实并不是云云。中止机制是怎样事情的?捕捉或检测到中止后,是抛出InterruptedException仍是重设中止形态和在办法中吞失落中止形态会有甚么成果?Thread.stop与中止比拟又有哪些异同?甚么情形下必要利用中止?本文将从以上几个方面进行形貌。
2.中止的道理
Java中止机制是一种合作机制,也就是说经由过程中止其实不能间接停止另外一个线程,而必要被中止的线程本人处置中止。这比如是家里的怙恃吩咐在外的后代要注重身材,但后代是不是注重身材,怎样注重身材则完整取决于本人。
Java中止模子也是这么复杂,每一个线程对象里都有一个boolean范例的标识(纷歧定就如果Thread类的字段,实践上也切实其实不是,这几个办法终极都是经由过程native办法来完成的),代表着是不是有中止哀求(该哀求能够来自一切线程,包含被中止的线程自己)。比方,当线程t1想中止线程t2,只必要在线程t1中将线程t2对象的中止标识置为true,然后线程2能够选择在符合的时分处置该中止哀求,乃至能够不睬会该哀求,就像这个线程没有被中止一样。
java.lang.Thread类供应了几个办法来操纵这其中断形态,这些办法包含:
publicstaticbooleaninterrupted
测试以后线程是不是已中止。线程的中止形态由该办法扫除。换句话说,假如一连两次挪用该办法,则第二次挪用将前往false(在第一次挪用已扫除了个中断形态以后,且第二次挪用查验完中止形态前,以后线程再次中止的情形除外)。
publicbooleanisInterrupted()
测试线程是不是已中止。线程的中止形态不受该办法的影响。
publicvoidinterrupt()
中止线程。

个中,interrupt办法是独一能将中止形态设置为true的办法。静态办法interrupted会将以后线程的中止形态扫除,但这个办法的定名极不直不雅,很简单形成曲解,必要出格注重。
下面的例子中,线程t1经由过程挪用interrupt办法将线程t2的中止形态置为true,t2能够在符合的时分挪用interrupted或isInterrupted来检测形态并做响应的处置。
别的,类库中的有些类的办法也大概会挪用中止,如FutureTask中的cancel办法,假如传进的参数为true,它将会在正在运转异步义务的线程上挪用interrupt办法,假如正在实行的异步义务中的代码没有对中止做出呼应,那末cancel办法中的参数将不会起到甚么效果;又如ThreadPoolExecutor中的shutdownNow办法会遍历线程池中的事情线程并挪用线程的interrupt办法来中止线程,以是假如事情线程中正在实行的义务没有对中止做出呼应,义务将一向实行直到一般停止。
3.中止的处置
既然Java中止机制只是设置被中止线程的中止状态,那末被中止线程该做些甚么?
处置机会
明显,作为一种合作机制,不会强求被中止线程必定要在某个点举行处置。实践上,被中止线程只需在符合的时分处置便可,假如没有符合的工夫点,乃至能够不处置,这时候候在义务处置层面,就跟没有挪用中止办法一样。“符合的时分”与线程正在处置的营业逻辑严密相干,比方,每次迭代的时分,进进一个大概堵塞且没法中止的办法之前等,但多数不会呈现在某个临界区更新另外一个对象形态的时分,由于这大概会招致对象处于纷歧致形态。
处置机会决意着程序的效力与中止呼应的敏捷性。频仍的反省中止形态大概会使程序实行效力下落,相反,反省的较少大概使中止哀求得不到实时呼应。假如收回中止哀求以后,被中止的线程持续实行一段工夫不会给体系带来劫难,那末就能够将中止处置放到便利反省中止,同时又能从必定水平上包管呼应敏捷度的中央。当程序的功能目标对照关头时,大概必要创建一个测试模子来剖析最好的中止检测点,以均衡功能和呼应敏捷性。
<p>
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。

只想知道 发表于 2015-1-18 17:00:30

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

不帅 发表于 2015-1-22 15:06:07

是一种突破用户端机器环境和CPU

admin 发表于 2015-1-26 17:02:32

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

灵魂腐蚀 发表于 2015-1-27 10:13:16

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

精灵巫婆 发表于 2015-2-5 04:43:22

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

再见西城 发表于 2015-2-11 04:31:29

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

小女巫 发表于 2015-3-1 21:06:43

是一种使网页(Web Page)产生生动活泼画面的语言

小魔女 发表于 2015-3-17 16:09:11

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

第二个灵魂 发表于 2015-3-24 10:45:11

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
页: [1]
查看完整版本: 发布一篇Java中止机制详解