java wait和notify 简单理解
来源:互联网 发布:蜂窝移动网络数据漫游 编辑:程序博客网 时间:2024/06/02 05:34
/**
* @author yangwl
*
* wait noify noifyall
* 注意 : 因为涉及到对象锁,他们必须都放在synchronized中来使用.
* wait和notify大概可以理解:当多个线程对公共资源同时访问时,人为有意的控制线程访问的顺序.以达到我们的目的,
* 那么,这时候,锁对象就是这个公共资源了.怎么表示一个线程获得了这个锁呢?
* 像这样: synchronized(obj) {} 这样就获得了资源锁,wait和notify的调用都在{}中,
* 这样,字面上就可以理解为执行同步块的线程可以决定是否调用wait或notify(要在同步块外调用,你当然决定不了当前哪个线程在调用)
* wait: 暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行(程序停顿在这一行).
* notify/notifyall: 唤醒因锁池中的线程,使之运行.
*
*
* 下面这个生产者消费者的例子:
* t1.start();
t2.start(); 启动两个线程
* 生产者队列如果满了,则暂定生产者线程并释放资源锁以便消费者线程可以获得锁
* 消费者线程获得锁,出队列以后 调用了notify唤醒锁池中的线程,下次可能消费者线程再次运行 ,也有可能消费者线程运行,取决于调度程序怎么调用了.
*
* 注意: wait以后,线程暂停 ,其他线程获得锁,执行
* notify 以后,由于当前线程没有被暂停,下次可能还会执行,也可能不会
*
*
* @author yangwl
*
* wait noify noifyall
* 注意 : 因为涉及到对象锁,他们必须都放在synchronized中来使用.
* wait和notify大概可以理解:当多个线程对公共资源同时访问时,人为有意的控制线程访问的顺序.以达到我们的目的,
* 那么,这时候,锁对象就是这个公共资源了.怎么表示一个线程获得了这个锁呢?
* 像这样: synchronized(obj) {} 这样就获得了资源锁,wait和notify的调用都在{}中,
* 这样,字面上就可以理解为执行同步块的线程可以决定是否调用wait或notify(要在同步块外调用,你当然决定不了当前哪个线程在调用)
* wait: 暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行(程序停顿在这一行).
* notify/notifyall: 唤醒因锁池中的线程,使之运行.
*
*
* 下面这个生产者消费者的例子:
* t1.start();
t2.start(); 启动两个线程
* 生产者队列如果满了,则暂定生产者线程并释放资源锁以便消费者线程可以获得锁
* 消费者线程获得锁,出队列以后 调用了notify唤醒锁池中的线程,下次可能消费者线程再次运行 ,也有可能消费者线程运行,取决于调度程序怎么调用了.
*
* 注意: wait以后,线程暂停 ,其他线程获得锁,执行
* notify 以后,由于当前线程没有被暂停,下次可能还会执行,也可能不会
*
*
*/
public class Test04 {public static void main(String[] args) throws InterruptedException {Queue buffer = new LinkedList<>();int maxSize = 10;Thread t1 = new Thread(new Producter(buffer, maxSize));Thread t2 = new Thread(new Customer(buffer, maxSize));t1.start();t2.start();}}class Producter implements Runnable {Queue buffer;int maxSize;public Producter(Queue buffer, int maxSize) {this.buffer = buffer;this.maxSize = maxSize;}@Overridepublic void run() {while(true) {synchronized(buffer) {while(buffer.size() == maxSize) {System.out.println("队列已满,生产者线程暂停."+buffer.size());try {buffer.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Random random = new Random(); int i = random.nextInt(); System.out.println("Producing value : " + i + "-------size" + buffer.size()); buffer.add(i); buffer.notifyAll(); }}}}class Customer implements Runnable {Queue buffer;int maxSize;public Customer(Queue buffer, int maxSize) {this.buffer = buffer;this.maxSize = maxSize;}@Overridepublic void run() {while(true) {synchronized(buffer) {while(buffer.isEmpty()) {System.out.println("队列已空,消费者线程暂停."+buffer.size());try {buffer.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("Consuming value : " + buffer.remove() + "-------size" + buffer.size()); buffer.notifyAll(); }}}}
0 0
- java wait和notify 简单理解
- Java wait() 和 notify() 理解
- 理解wait和notify
- java wait和notify
- 真正理解java wait notify
- java:简单使用wait,notify
- 深入理解Java多线程中的wait(),notify()和sleep()
- java notify,wait,notifyAll理解和实例(一)
- 深入理解Java多线程中的wait(),notify()和sleep()
- Java线程同步中的wait()和notify()使用简单示例
- java中 wait 和notify
- java中wait和notify
- java的wait和notify
- 关于 JAVA wait()和notify()
- Java多线程wait()和notify()
- java wait()、notify()和notifyAll()
- java 关于wait 和notify
- JAVA多线程的理解wait、notify、notifyAll
- Poj 3069 Saruman's Army【贪心】
- navigationBar 滑动 隐藏与显示 功能
- BZOJ3440 传球游戏
- Spring中applicationContext.xml位置问题
- 给定一个字符串,求出最长的连续配对括号子串的长度
- java wait和notify 简单理解
- [Leetcode] Lowest Common Ancestor of a Binary Tree
- Jenkins 常用配置设定 -- MacOS
- 康托展开的相关研究
- Python与数据库(2)Oracle
- ROS start
- STL 学习
- 关于增删改的接口的看法
- Python布局管理器