zoukankan      html  css  js  c++  java
  • Java多线程(3):wait()/notify()实例

    下面是代码实例

     1 public class WaitDemo implements Runnable {
     2 
     3     private Object lock;
     4 
     5     public WaitDemo(Object lock) {
     6         this.lock = lock;
     7     }
     8 
     9     @Override
    10     public void run() {
    11         synchronized (lock) {
    12             System.out.println("Begin wait() ThreadName=" + Thread.currentThread().getName());
    13             try {
    14                 // [STEP-1] WaitDemo线程立刻释放获得的对象锁lock,并放弃CPU,进入等待队列。
    15                 lock.wait();
    16             } catch (InterruptedException e) {
    17                 e.printStackTrace();
    18             }
    19             // [STEP-4] WaitDemo有机会获得另一个线程释放的锁,并从等待的地方起开始执行。
    20             System.out.println("End wait() ThreadName=" + Thread.currentThread().getName());
    21         }
    22     }
    23 }
     1 public class NotifyDemo implements Runnable {
     2 
     3     private Object lock;
     4 
     5     public NotifyDemo(Object lock) {
     6         this.lock = lock;
     7     }
     8 
     9     @Override
    10     public void run() {
    11         synchronized (lock) {
    12             System.out.println("Begin notify() ThreadName=" + Thread.currentThread().getName());
    13             // [STEP-2] NotifyDemo线程唤醒其他挂起的线程(WaitDemo线程)。但是此时它并不立即释放锁。
    14             lock.notify();
    15             try {
    16                 System.out.println("Sleep 3s...");
    17                 Thread.sleep(3000);
    18             } catch (InterruptedException e) {
    19                 e.printStackTrace();
    20             }
    21             System.out.println("End notify() ThreadName=" + Thread.currentThread().getName());
    22             // [STEP-3] 释放锁。
    23         }
    24     }
    25 }
     1 // 该实例无法保证假设在线程WaitDemo和NotifyDemo的先后执行顺序。如果线程B先执行了notify()然后结束了,线程A才去执行wait(),那此时,线程A将无法被正常唤醒了
     2 public class DemoTest {
     3 
     4     public static void main(String[] args) throws InterruptedException {
     5         Object o = new Object();
     6         // WaitDemo
     7         Thread a = new Thread(new WaitDemo(o));
     8         a.setName("WaitDemo");
     9         a.start();
    10         Thread.sleep(2000);
    11         // NotifyDemo
    12         Thread b = new Thread(new NotifyDemo(o));
    13         b.setName("NotifyDemo");
    14         b.start();
    15     }
    16 }
  • 相关阅读:
    POJ
    归并排序+归并排序求逆序对(例题P1908)
    HDU
    2018-12-5 及 codeforces round 525v2
    2018-12-1学习纪录
    近期总结和未来规划
    C++ storage allocation + Dynamic memory allocation + setting limits + initializer list (1)
    注意项
    第四课 计算机的基本组成
    第二课+第三课 计算机系统概论
  • 原文地址:https://www.cnblogs.com/storml/p/7646145.html
Copyright © 2011-2022 走看看