仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 511|回复: 9
打印 上一主题 下一主题

[学习教程] 来看java的线程机制(二) Thread的性命周期

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:01:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。
之前讲到Thread的创立,那是Thread性命周期的第一步,厥后就是经由过程start()办法来启动Thread,它会实行一些外部的办理事情然后挪用Thread的run()办法,此时该Thread就是alive(活泼)的,并且我们还能够通过isAlive()办法来断定该线程是不是启动仍是闭幕。
一旦启动Thread后,我们就只能实行一个方法:run(),而run()办法就是卖力实行Thread的义务,以是闭幕Thread的办法很复杂,就是闭幕run()办法。仔细检察文档,我们会发明内里有一个办法:stop(),仿佛能够用来中断Thread,可是这个办法已被取销了,由于它存在着外部的合作。
我们常常必要一个不休实行的Thread,然后在某个特定的前提下才会闭幕它,办法有良多,但最经常使用的有设定标志和中止Thread两种体例。
我们将之前例子中的Thread改写一下:
  1. publicclassRandomCharacterGeneratorextendsThreadimplementsCharacterSource{
  2. staticchar[]chars;
  3. staticStringcharArray="abcdefghijklmnopqrstuvwxyz0123456789";
  4. static{
  5. chars=charArray.toCharArray();
  6. }
  7. privatevolatilebooleandone=false;
  8. Randomrandom;
  9. CharacterEventHandlerhandler;
  10. publicRandomCharacterGenerator(){
  11. random=newRandom();
  12. handler=newCharacterEventHandler();
  13. }
  14. publicintgetPauseTime(){
  15. return(int)(Math.max(1000,5000*random.nextDouble()));
  16. }
  17. @Override
  18. publicvoidaddCharacterListener(CharacterListenercl){
  19. handler.addCharacterListener(cl);
  20. }
  21. @Override
  22. publicvoidremoveCharacterListener(CharacterListenercl){
  23. handler.removeCharacterListener(cl);
  24. }
  25. @Override
  26. publicvoidnextCharacter(){
  27. handler.fireNewCharacter(this,
  28. (int)chars[random.nextInt(chars.length)]);
  29. }
  30. publicvoidrun(){
  31. while(!done){
  32. nextCharacter();
  33. try{
  34. Thread.sleep(getPauseTime());
  35. }catch(InterruptedExceptionie){
  36. return;
  37. }
  38. }
  39. }
  40. publicvoidsetDone(){
  41. done=true;
  42. }
  43. }
复制代码
如今我们多了一个标志:done,如许我们就能够在代码中经由过程挪用setDone()来决意甚么时分中断该Thread。这里利用了volatile关头字,它次要是为了同步。这点会放在同步这里讲。
设定标志的最年夜问题就是我们必需守候标志的形态,如许就会形成提早。固然,这类提早是没法制止的,但必需想举措延长到最小。因而,中止Thread这类办法就有它的发扬中央了。
我们能够经由过程interrupt()办法来中止Thread,该办法会形成两个反作用:
1.它会招致任何的堵塞办法城市抛出InterruptedException,我们必需强制性的捕捉这个毛病哪怕我们基本就不必要处置它,这也是java的非常处置机制让人诟病的一个中央。
2.设定Thread对象外部的标志来唆使此Thread已被中止了,像是如许:
  1. publicvoidrun
  2. (){
  3. while(!isInterrupted()){
  4. ...
  5. }
  6. }
复制代码
固然没法制止提早,可是提早已被延长了。
不管是接纳标志仍是中止的办法,我们之以是无法打消提早的缘故原由是我们没法断定是反省标志先仍是挪用办法先,这就是所谓的racecondition,是线程处置中永久没法制止的话题。
Thread不但能够被闭幕,还能够停息,挂起和恢复。
Thread底本有suspend()办法和resume()办法来实行挂起和恢复,但它们和stop()出于一样的缘故原由,都被取销了。
我们能够经由过程sleep()办法来挂起Thread,当在指定的工夫后,它就会主动恢复。严厉意义上讲,sleep其实不同等于suspend,真实的suspend应当是由一个线程来挂起另外一个线程,可是sleep只会影响以后的Thread。要想真正完成挂起和恢复,我们可使用守候和关照机制,但这个机制最年夜的成绩就是我们的Thread必需利用该手艺来编写。
Thread在闭幕后,假如有大概,我们还必要对它举行善后。即便Thread已被闭幕了,可是其他对象只需还持有它的援用,它们就能够挪用该Thread的资本,这也会招致该Thread没法被接纳。
但我们偶然候仍是但愿持续坚持该Thread的援用,由于我们想要辨别它是不是真的已完成了事情,可使用join()办法。join()办法会被堵塞住直到Thread完成它的run()办法,可是这个存在风险:第一次对join()方法的挪用大概会一向被堵塞住很长工夫直到Thread真正完成,以是,一样平常情形下我们仍是利用isAlive()办法来判别。
因为我们能够经由过程完成一个Runnable接口来界说我们的义务,以是在判别地点线程是不是已中止的时分,就有一个成绩:该义务还没有绑定就任何线程上。我们能够经由过程currentThread()办法来取得当前Thread的援用,接着挪用isInterrupted()来判别线程是不是中止。

恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?
小魔女 该用户已被删除
沙发
发表于 2015-1-20 11:26:18 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
变相怪杰 该用户已被删除
板凳
发表于 2015-1-25 22:04:19 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
老尸 该用户已被删除
地板
发表于 2015-1-31 08:19:36 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
小女巫 该用户已被删除
5#
发表于 2015-2-2 15:37:21 | 只看该作者
是一种为 Internet发展的计算机语言
金色的骷髅 该用户已被删除
6#
发表于 2015-2-7 23:29:25 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
山那边是海 该用户已被删除
7#
发表于 2015-2-23 15:45:04 | 只看该作者
是一种突破用户端机器环境和CPU
若天明 该用户已被删除
8#
发表于 2015-3-7 09:23:39 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
灵魂腐蚀 该用户已被删除
9#
发表于 2015-3-14 17:05:53 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
透明 该用户已被删除
10#
发表于 2015-3-21 12:19:12 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表