3.1.1多线程通讯(等待通知机制)
来源:互联网 发布:旅馆住宿登记软件 编辑:程序博客网 时间:2024/06/05 04:21
wait()方法:使当前执行代码的线程等待,当前线程释放锁,在wait处停止执行代码,直到接到通知或被中断。在使用wait前面,线程必须获得太对象的对象锁。
notify方法:唤醒某个处于wait状态线程,使用之前,必须先获得该对象的对象锁,直到执行完同步块代码之后,wait状态的线程才会获得锁。
package test;/** * Created by sunyifeng on 17/10/15. */public class MyThread1 extends Thread { private Object lock; public MyThread1(Object lock) { super(); this.lock = lock; } @Override public void run(){ try { synchronized (lock) { System.out.println("开始等待时间:" + System.currentTimeMillis()); lock.wait(); System.out.println("结束等待时间:" + System.currentTimeMillis()); } } catch (InterruptedException e) { e.printStackTrace(); } }}
package test;/** * Created by sunyifeng on 17/10/15. */public class MyThread2 extends Thread { private Object lock; public MyThread2(Object lock) { super(); this.lock = lock; } @Override public void run() { synchronized (lock) { System.out.println("开始唤醒时间:" + System.currentTimeMillis()); lock.notify(); System.out.println("结束唤醒时间:" + System.currentTimeMillis()); } }}
package test;/** * Created by sunyifeng on 17/10/15. */public class Run { public static void main(String[] args) { try { // 锁 Object lock = new Object(); // 线程1 MyThread1 myThread1 = new MyThread1(lock); myThread1.start(); // Thread.sleep(3000); // 线程2 MyThread2 myThread2 = new MyThread2(lock); myThread2.start(); } catch (InterruptedException e) { e.printStackTrace(); } }}
运行结果:开始等待时间:1508077481913
开始唤醒时间:1508077484918
结束唤醒时间:1508077484919
结束等待时间:1508077484919
总结:wait使线程停止运行,notify使停止的线程继续运行。
再举一个栗子。
package demo;import java.util.List;import java.util.ArrayList;/** * Created by sunyifeng on 17/10/15. */public class MyList { private static List<String> list = new ArrayList<String>(); public static void add() { list.add("sunyf"); } public static int size() { return list.size(); }}
package demo;/** * Created by sunyifeng on 17/10/15. */public class ThreadA extends Thread { private Object lock; public ThreadA(Object lock) { super(); this.lock = lock; } @Override public void run() { try { synchronized (lock) { if (MyList.size() != 5) { System.out.println("等待开始,时间:" + System.currentTimeMillis()); lock.wait(); System.out.println("等待结束,时间:" + System.currentTimeMillis()); } } } catch (InterruptedException e) { e.printStackTrace(); } }}
package demo;/** * Created by sunyifeng on 17/10/15. */public class ThreadB extends Thread { private Object lock; public ThreadB(Object lock) { super(); this.lock = lock; } @Override public void run() { try { synchronized (lock) { for (int i = 0; i < 10; i++) { MyList.add(); if (MyList.size() == 5) { lock.notify(); System.out.println("已经发出通知"); } System.out.println("添加了" + (i + 1) + "个元素"); Thread.sleep(1000); } } } catch (InterruptedException e) { e.printStackTrace(); } }}
package demo;/** * Created by sunyifeng on 17/10/15. */public class Run { public static void main(String[] args) { try { Object lock = new Object(); // ThreadA threadA = new ThreadA(lock); threadA.setName("A"); threadA.start(); // Thread.sleep(1000); // ThreadB threadB = new ThreadB(lock); threadB.setName("B"); threadB.start(); } catch (InterruptedException e) { e.printStackTrace(); } }}
运行结果:等待开始,时间:1508079281022
添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
已经发出通知
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素
等待结束,时间:1508079292058
程序说明:notify方法执行之后并不是立即释放锁,直到同步块的代码执行完才释放锁。
阅读全文
0 0
- 3.1.1多线程通讯(等待通知机制)
- 多线程 等待/通知机制
- 多线程通讯-等待唤醒机制
- 多线程的等待/通知机制
- 多线程之等待通知机制
- 《多线程编程》学习之七:等待/通知机制(一)
- 《多线程编程》学习之七:等待/通知机制(二)
- 3.1等待/通知机制(wait/notify)
- java多线程的等待和通知机制
- java多线程系列(三)---等待通知机制
- java多线程系列(三)---等待通知机制
- 多线程 等待/通知机制的实现
- 多线程编程中的等待/通知机制和等待超时模式
- 多线程间的通讯之等待唤醒机制
- JAVA多线程-线程间通信(一)-等待/通知机制(wait/notify)
- java多线程之线程间通信:等待/通知机制
- java并发(等待/通知机制)
- 等待/通知机制:
- LeetCode Exercise 5: Trapping Rain Water
- 7-9 龟兔赛跑(20 分)
- 【Codeforces Round #440 (Div. 2) C】 Maximum splitting
- 串口工具minicom的使用方法
- Maven-环境搭建以及建立Maven项目
- 3.1.1多线程通讯(等待通知机制)
- 文章标题
- JSP 笔记 (一 : 语法 与 运行 原理)
- 用insert into插入select结果时插入固定值
- URAL1297-Palindrome
- C语言标准库之 <assert.h>
- python数据类型(二)
- 逗号表达式
- Mysql数据库的备份与恢复 导库