欢迎来到天天文库
浏览记录
ID:30768944
大小:482.50 KB
页数:9页
时间:2019-01-03
《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
此文档下载收益归作者所有