从这个图中可以看出,等待状态是一种特殊的状态。使线程陷入等待实际上是暂时剥夺线程当前拥有的CPU时间片和获取CPU时间片的资格,使其返回到就绪状态。除非被唤醒,否则等待时间已满,该线程将一直等待。不会被JVM线程调度器选中并赋予CPU时间片。处于等待的线程一旦恢复执行,与其他处于就绪状态被线程调度器选中的线程不同,将从上次结束执行的断点处开始执行,而非从头开始。
使线程中断运行,返回就绪状态的手段是调用java.lang.Object对象的wait()方法;唤醒处于等待状态的线程的手段是调用java.lang.Object对象的notify()方法
为了加深理解,下面就通过具体例子来说明线程等待和唤醒
第一个:
通过继承Thread来创建子线程。
运行效果如下:
第二个:
通过实现Runnable接口来创建子线程
运行效果如下:
第三个:
通过实现Runnable,又通过Object对象的notifyAll()方法一次性唤醒多个同一个对象创造的线程。
运行效果如下:
总结:1).利用Thread.sleep().使线程开始休眠指定的时间,以便让各个子线程进入等待状态。
2).synchronized同步锁的使用。这一块在后面文章中会加以解说。