java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术

java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术

ID:30768944

大小:482.50 KB

页数:9页

时间:2019-01-03

java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术_第1页
java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术_第2页
java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术_第3页
java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术_第4页
java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术_第5页
资源描述:

《java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、hva并发编程(3):线程挂起、恢复与终止的正确方法(含代码)-编程开发技术Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)原文出处:兰亭风雨挂起和恢复线程???Thread的API中包含两个被淘汰的方法,它们用于临吋挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的。如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件一一其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁。另外,在长时间计算期间挂起线程也可能导致问题。下面的代码演示了通过休眠来延缓运行,模拟长吋间运行的情况,使线程更可能在不适

2、当的时候被挂起:publicclassDcprccatcdSuspcndRcsumccxtcndsObjcctimplementsRunnable{//volatile关键字,表示该变量可能在被一个线程使用的同时,被另一个线程修改privatevolatileintfirstVal;privatevolat订cintsecondVal;//判断二者是否相等publicbooleanareValuesEqual(){return(firstVal二二secondVal);}publicvoidrun(){try{firstVal二0;secondVal二0;wor

3、kMethodO;}catch(InterruptedExceptionx){System,out.println(〃interruptedwhileinworkMethod()“);}privatevoidworkMethod()throwsInterruptedException{intval=1;while(true){stepOne(val);stepTwo(val);val++;Thread,sleep(200);//再次循环钱休眠200毫秒//赋值后,休眠300毫秒,从而使线程有机会在stepOne操作和stcpTwo操作之间被挂起privatevo

4、idstepOne(intnewVal)throwsInterruptedException{firstVal=newVal;Thread,sleep(300);//模拟长吋间运行的情况}privatevoidstepTwo(intnewVal){secondVal=newVal;}publicstaticvoidmain(String[]args){DeprecatedSuspendResumedsr=newDeprecatedSuspendResume();Threadt二newThread(dsr);t.start();//休眠1秒,让其他线程冇机会获得执

5、行try{Thread.sleep(1000);}catch(TnterruptedExceptionx){}for(inti=0;i<10;i++){〃挂起线程t.suspend();System,out.printin(,zdsr.areValuesEqual()二〃+dsr.areValuesEqual());〃恢复线程t.resume();try{//线程随机休眠o〜2秒Thread,sleep((long)(Math,random()*2000.0));}catch(InterruptedExceptionx){//略System,exit(0);//

6、中断应用程序某次运行结果如下:从areValuesEqual()返回的值有时为true,冇时为false。以上代码中,在设置firstVal之后,但在设置secondVal之前,挂起新线程会产生麻烦,此时输出的结果会为false(情况1),这段吋间不适宜挂起线程,但因为线程不能控制何时调用它的suspend方法,所以这种情况是不可避免的。当然,即使线程不被挂起(注释掉挂起和恢复线程的两行代码),如果在main线程中执asr.areValuesEqual()进行比较时,恰逢stepOne操作执行完,而stepTwo操作还没执行,那么得到的结果同样可能是false(

7、情况2)。下面我们给岀不用上述两个方法来实现线程挂起和恢复的策略一一设置标志位。通过该方法实现线程的挂起和恢复有一个很好的地方,就是可以在线程的指定位置实现线程的挂起和恢复,而不用担心其不确定性。对于上述代码的改进代码如下:publicclassAlternateSuspendResumeextendsObjectimplementsRunnableprivatevolatileintfirstVal;privatevolatileintsecondVal;//增加标志位,用來实现线程的挂起和恢复privatcvolat订cbooleansuspended;pu

8、blicbooleana

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

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

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