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     @Override10     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     @Override10     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         // NotifyDemo12         Thread b = new Thread(new NotifyDemo(o));13         b.setName("NotifyDemo");14         b.start();15     }16 }
(0)

相关推荐

  • 只会用wait和notify?30分钟案例告诉你有更好得选择

    Condition 是 JDK 1.5 中提供的用来替代 wait 和 notify 的线程通讯方法,那么一定会有人问:为什么不能用 wait 和 notify 了? 哥们我用的好好的.老弟别着急,听 ...

  • 探索 Android 多线程优化

    code小生,一个专注大前端领域的技术平台 公众号回复 Android 加入我的技术群 作者:灯不利多 链接:https://juejin.im/post/5d45a75de51d4561ee1bdf ...

  • java多线程并发实例

    package cn.crhms.modelsystem.utils;import java.util.ArrayList;import java.util.List;import java.util ...

  • JAVA多线程学习笔记整理

    多线程: 三种创建方法 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程. (匿名内部类) (Lambda表达式) 实现Runable接口,以线程运行 ...

  • Java多线程访问Synchronized同步方法的八种使用场景

    简介 本文将介绍7种同步方法的访问场景,我们来看看这七种情况下,多线程访问同步方法是否还是线程安全的.这些场景是多线程编程中经常遇到的,而且也是面试时高频被问到的问题,所以不管是理论还是实践,这些都是 ...

  • Java多线程(2):线程加入/join()

    线程加入 join()方法,等待其他线程终止.在当前线程(主线程)中调用另一个线程(子线程)的join()方法,则当前线程转入阻塞状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态. 也就是主 ...

  • Java多线程(1):3种常用的实现多线程类的方法

    (1) 继承java.lang.Thread类(Thread也实现了Runnable接口) 继承Thread类的方法是比较常用的一种,如果说你只是想起一条线程.没有什么其它特殊的要求,那么可以使用Th ...

  • Java多线程

    什么是多线程 提到线程,不得不先说一下什么是进程. 进程就是正在运行的程序.当一个程序进入内存运行时,即变成一个进程.每个进程都有独立的代码和数据空间(进程上下文).一个进程包含1--n个线程.一个线 ...

  • Java多线程上下文传递在复杂场景下的实践

    一.引言 海外商城从印度做起,慢慢的会有一些其他国家的诉求,这个时候需要我们针对当前的商城做一个改造,可以支撑多个国家的商城,这里会涉及多个问题,多语言,多国家,多时区,本地化等等.在多国家的情况下如 ...

  • C# 多线程控制控件实例(invoke,控件的委托方法)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  • 诚之和:教你使用Java实现树形菜单对象 实例代码解析

    本文实例为大家分享了java实现树形菜单对象的具体代码,供大家参考,具体内容如下 1.SysMenu package com.zy.shiro.domain;import com.baomidou.m ...