一直对同步代码块和notify()不是很熟悉,后来做了个教程,总算是了解清楚了。
wait(),notify()和notifyAll() 其实是用于线程间的通信的。
Java有一个内建的等待机制来允许线程在等待信号的时候变为非运行状态。java.lang.Object 类定义了三个方法,wait()、notify()和notifyAll()来实现这个等待机制。
一个线程一旦调用了任意对象的wait()方法,就会变为非运行状态,直到另一个线程调用了同一个对象的notify()方法。为了调用wait()或者notify(),
线程必须先获得那个对象的锁。也就是说,线程必须在同步块里调用wait()或者notify()。
package io.study.example; public class WaitAndNotify { class MonitorObject { } class TestThread1 implements Runnable { WaitNotifyObject object; TestThread1(WaitNotifyObject obj) { this.object = obj; } @Override public void run() { this.object.doWait(); } } class TestThread2 implements Runnable { WaitNotifyObject object; TestThread2(WaitNotifyObject obj) { this.object = obj; } @Override public void run() { this.object.doNotify(); } } class WaitNotifyObject { MonitorObject myMonitorObject = new MonitorObject(); boolean wasSignalled = false; //避免假唤醒的情况 public void doWait() { synchronized (myMonitorObject) { while(!wasSignalled){ try { System.out.println("WaitNotifyObject wait!!"); // 一个线程一旦调用了任意对象的wait()方法,就会变为非运行状态,直到另一个线程调用了同一个对象的notify()方法 myMonitorObject.wait(); //唤醒后会继续从wait()地方开始执行 System.out.println("WaitNotifyObject wait over!!"); } catch (InterruptedException e) { e.printStackTrace(); } } wasSignalled = true; } } public void doNotify() { synchronized (myMonitorObject) { wasSignalled = true; System.out.println("WaitNotifyObject notify!!"); myMonitorObject.notify(); } } } public static void main(String[] args) throws InterruptedException { WaitAndNotify test = new WaitAndNotify(); WaitNotifyObject obj = test.new WaitNotifyObject(); Thread t1 = new Thread(test.new TestThread1(obj)); Thread t2 = new Thread(test.new TestThread2(obj)); t1.start(); Thread.sleep(1000); t2.start(); //synchronized(this) 表示监控调用方方法的本身 } }
其中看到代码中有一个wasSignalled变量。
这个变量用于阻止线程假启动的情况。
相关推荐
源码—Java多线程5—死锁和wait notify notifyAll
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
Java多线程同步(wait()notify()notifyAll())[文].pdf
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 ...9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 9.9 计时器线程Timer 9.10 线程联合 9.11 守护线程
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
绍java多线程之wait(),notify(),notifyAll()
本篇文章是对java多线程 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
主要介绍了Java多线程基础 线程的等待与唤醒,需要的朋友可以参考下
java多线程应用实例,包括wait、notify、notifyAll等的应用方法,经过调试,可以直接运行。
Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、使用ThreadLocal 2.Executor:ExecutorService和Future 3.阻塞队列:put和take、offer和poll、drainTo 4.线程间通信:lock、condition、wait、notify...
本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...
Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程 生产者和消费者是一个十分经典的多线程协作模式 **常见方法:** - void wait() 当前线程等待,直到被其他线程唤醒 - void...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
python 多线程的同步机制 以python2例程的方式讲解了python 多线程的同步 常用的方法,主要是锁、条件同步、队列 多线程的同步 多线程情况下最常见的问题之一:数据共享; 当多个线程都要去修改某一个共享数据...
线程:Java多线程的实现方式,包括继承Thread类和实现Runnable接口。 锁:Java中的锁机制,包括synchronized关键字和ReentrantLock类。 线程池:Java中的线程池机制,包括线程池的创建、执行任务、关闭等操作。 并发...
创建多个condition对象 一个condition对象的signal(signalAll)方法和该对象的await方法是一一对应的,也就是一个condition对象的signal(signalAll)...Condition类的signalAll方法和Object类的notifyAll方法等效
Java自1995年面世以来得到了广泛得一个运用,但是对多...在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来实现的。