注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东东的博客

江南烟雨,同大家一起分享

 
 
 

日志

 
 

JAVA线程之三:线程的挂起和恢复  

2010-07-02 11:46:33|  分类: java相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1,概述:线程的挂起操作实质上就是使线程进入“非可执行”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运 行;在线程挂起后,可以通过重新唤醒线程来使之恢复运行。当一个线程进入“非可执行”状态,即挂起状态时,必然存在某种原因使其不能继续运行,这些原因可 能是如下几种情况:
     (1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
     (2)通过调用join()方法使线程挂起,如果某个线程在另一个线程t上调用t.join(),这个线程将被挂起,直到线程t执行完毕为止。
     (3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
2,sleep()方法:是一个使线程暂时停止一段执行时间的方法,该时间由给定的毫秒数决定。下面演示一个使用sleep()方法的例子,如下。
public void run()

{
     int count=3;
     while(true)

     {
           System.out.println(this);                     //打印对象
           try

           {
                 sleep(1000);                         //休眠1000ms
            }catch(Exception e)

            {
                 e.printStackTrace();
             }
             count--;                                      //变量count自减
             if(count==0)

                   return;                    //如果count为0,跳出循环
       }
}
代 码说明如下。首先定义一个控制跳出循环条件的变量count,在循环内打印对象,使线程在try块中休眠1000ms,最后当变量由3递减为0时,跳出循 环。在调用sleep()方法时,需要将这段代码放入try块中,这是因为如果在线程休眠时,持有对此线程引用的人也许会调用interrupt()方 法,使用interrupt()方法会使线程从“非可执行”执行状态返回到“可执行”状态,但会引发 java.lang.InterruptedException异常。
3,join()方法:能够使当前执行的线程停下来等待,直至join()方法所调用的那个线程结束,再恢复执行。例如如果有一个线程A正在运行,用户希望插入一个线程B,并且要求线程B执行完毕,然后再继续线程A,此时可以使用join()方法来完成这个需求。
4,wait()与notify()方法:wait()方法同样可以使线程进行挂起操作,调用了wait()方法的线程进入了“非可执行”状态,使用wait()方法有两种方式,例如:
thread.wait(1000);
或:
thread.wait();
thread.notify();
其中第一种方式给定线程挂起时间,基本上与sleep()方法用法相同。第二种方式是wait()与notify()方法配合使用,这种方式让wait()方法无限等下去,直到线程接收到notify()或notifyAll()消息为止。
     wait()、notify()、notifyAll()不同于其他线程方法,这3个方法是java.lang.Object类的一部分,所以在定义自己 类时会继承下来。wait()、notify()、notifyAll()都被声明为final类,所以无法重新定义。
5,suspend()与resume()方法
      有时更好地挂起方法是强制挂起线程,而不是为线程指定休眠时间,这种情况下由其他线程负责唤醒其继续执行,除了wait()与notify()方法之外, 线程中还有一对方法用于完成此功能,这就是suspend()与resume()方 法,thread.suspend();thread.resume();在这里,线程thread在运行到suspend()之后被强制挂起,暂停运 行,直到主线程调用thread.resume()方法时才被重新唤醒。
      Java2中已经废弃了suspend()和resume()方法,因为使用这两个方法可能会产生死锁,所以应该使用同步对象调用wait()和notify()的机制来代替suspend()和resume()进行线程控制。


转自:http://blog.csdn.net/zhandoushi1982/archive/2010/04/20/5506597.aspx

  评论这张
 
阅读(2569)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017