现在的位置: 首页 > 综合 > 正文

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

2013年08月14日 ⁄ 综合 ⁄ 共 1938字 ⁄ 字号 评论关闭

 

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()进行线程控制。

抱歉!评论已关闭.