Java线程:线程状态的转换

Java线程:线程状态的转换

ID:39551709

大小:57.00 KB

页数:12页

时间:2019-07-06

Java线程:线程状态的转换_第1页
Java线程:线程状态的转换_第2页
Java线程:线程状态的转换_第3页
Java线程:线程状态的转换_第4页
Java线程:线程状态的转换_第5页
资源描述:

《Java线程:线程状态的转换》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Java线程:线程状态的转换2008-09-1318:31:34标签:线程版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。Java线程:线程状态的转换 SCJP5学习笔记 一、线程状态 线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。用一个图来描述如下: 1、新状态:线程对象已经创建,还没有在其上调用start()方法。 2、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞

2、、等待或睡眠状态回来后,也返回到可运行状态。 3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。 4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。 5、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。如果在一个死去的线程上调用start(

3、)方法,会抛出java.lang.IllegalThreadStateException异常。 有关详细状态转换图可以参看本人的“Java多线程编程总结”中的图 二、阻止线程执行对于线程的阻止,考虑一下三个方面,不考虑IO阻塞的情况:睡眠;等待;因为需要一个对象的锁定而被阻塞。 1、睡眠Thread.sleep(longmillis)和Thread.sleep(longmillis,intnanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回

4、到可运行状态。 线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。 睡眠的实现:调用静态方法。       try{           Thread.sleep(123);       }catch(InterruptedExceptione){           e.printStackTrace();        } 睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。 例如,在前面的例子中,将一个耗时的操作改为睡眠,

5、以减慢线程的执行。可以这么写:    publicvoidrun(){       for(inti=0;i<5;i++){//很耗时的操作,用来减慢线程的执行//           for(longk=0;k<100000000;k++);           try{               Thread.sleep(3);           }catch(InterruptedExceptione){               e.printStackTrace(); .           }           System.o

6、ut.println(this.getName()+":"+i);       }   } 运行结果:阿三:0李四:0阿三:1阿三:2阿三:3李四:1李四:2阿三:4李四:3李四:4Processfinishedwithexitcode0 这样,线程在每次执行过程中,总会睡眠3毫秒,睡眠了,其他的线程就有机会执行了。 注意:1、线程睡眠是帮助所有线程获得运行机会的最好方法。2、线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。3、s

7、leep()是静态方法,只能控制当前正在运行的线程。 下面给个例子:/***一个计数器,计数到100,在每个数字之间暂停1秒,每隔10个数字输出一个字符串**@authorleizhimin2008-9-149:53:49*/publicclassMyThreadextendsThread{    publicvoidrun(){        for(inti=0;i<100;i++){            if((i)%10==0){                System.out.println("-------"+i);       

8、     }            System.out.print(i);            try{       

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。