java线程之wait、notifyAll
来源:互联网 发布:深圳网络推广培训 编辑:程序博客网 时间:2024/06/10 19:56
wait、notifyAll是线程之间用来通信的,设计模式里的观察者模式。
例子,上课前,同学在玩,一个同学观察老师是不是来了,如果来了,叫其他同学坐好。
package com.concurrent;import java.util.HashSet;import java.util.Set;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import junit.framework.TestCase;public class TestWaitNotify extends TestCase {static final CountDownLatch cdl = new CountDownLatch(31);public void testWaitNotify() {Monitor monitor = new Monitor();ExecutorService executorService = Executors.newFixedThreadPool(31);for (int i = 0; i < 30; i++) {Student student = new Student(monitor);monitor.addClassMate(student);executorService.execute(student);}executorService.execute(monitor);System.out.println(Thread.currentThread() + "老师还没来");monitor.setTeacherIsComing(true);System.out.println(Thread.currentThread() + "老师来了");try {cdl.await();} catch (InterruptedException e) {e.printStackTrace();}executorService.shutdown();}static class Student implements Runnable {private Monitor monitor;Student() {}Student(Monitor monitor) {this.monitor = monitor;}@Overridepublic void run() {synchronized (monitor) {while (!monitor.isTeacherIsComing()) {try {monitor.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread() + "回到自己座位,坐下");cdl.countDown();}}}static class Monitor extends Student {private boolean teacherIsComing = false;private Set<Student> classMates = new HashSet<Student>();@Overridepublic void run() {synchronized (this) {while (!teacherIsComing) {System.out.println(Thread.currentThread() + "看老师是否来了");}notifyAll();cdl.countDown();}}public boolean isTeacherIsComing() {return teacherIsComing;}public void setTeacherIsComing(boolean teacherIsComing) {this.teacherIsComing = teacherIsComing;}public void addClassMate(Student student) {classMates.add(student);}}}
运行一下:
Thread[main,5,main]老师还没来Thread[main,5,main]老师来了Thread[pool-1-thread-28,5,main]回到自己座位,坐下Thread[pool-1-thread-29,5,main]回到自己座位,坐下Thread[pool-1-thread-26,5,main]回到自己座位,坐下Thread[pool-1-thread-24,5,main]回到自己座位,坐下Thread[pool-1-thread-22,5,main]回到自己座位,坐下Thread[pool-1-thread-27,5,main]回到自己座位,坐下Thread[pool-1-thread-25,5,main]回到自己座位,坐下Thread[pool-1-thread-23,5,main]回到自己座位,坐下Thread[pool-1-thread-20,5,main]回到自己座位,坐下Thread[pool-1-thread-21,5,main]回到自己座位,坐下Thread[pool-1-thread-19,5,main]回到自己座位,坐下Thread[pool-1-thread-18,5,main]回到自己座位,坐下Thread[pool-1-thread-17,5,main]回到自己座位,坐下Thread[pool-1-thread-16,5,main]回到自己座位,坐下Thread[pool-1-thread-14,5,main]回到自己座位,坐下Thread[pool-1-thread-15,5,main]回到自己座位,坐下Thread[pool-1-thread-12,5,main]回到自己座位,坐下Thread[pool-1-thread-13,5,main]回到自己座位,坐下Thread[pool-1-thread-10,5,main]回到自己座位,坐下Thread[pool-1-thread-11,5,main]回到自己座位,坐下Thread[pool-1-thread-9,5,main]回到自己座位,坐下Thread[pool-1-thread-8,5,main]回到自己座位,坐下Thread[pool-1-thread-7,5,main]回到自己座位,坐下Thread[pool-1-thread-6,5,main]回到自己座位,坐下Thread[pool-1-thread-4,5,main]回到自己座位,坐下Thread[pool-1-thread-5,5,main]回到自己座位,坐下Thread[pool-1-thread-3,5,main]回到自己座位,坐下Thread[pool-1-thread-2,5,main]回到自己座位,坐下Thread[pool-1-thread-1,5,main]回到自己座位,坐下Thread[pool-1-thread-30,5,main]回到自己座位,坐下
0 0
- java线程之wait、notifyAll
- java线程wait、notify、notifyAll
- JAVA -- 线程wait()、notify()、notifyAll()
- JAVA线程 -- wait notify notifyAll
- java线程:wait,notify,notifyAll
- 线程同步之wait,notify,notifyall
- 【java】线程同步(synchronized,wait,notify,notifyAll)
- java线程同步(synchronized,wait,notify,notifyAll)
- Java线程_Notify,NotifyAll,Wait方法
- java线程间协作【wait(),notifyAll()】
- Java 线程wait, notify and notifyAll 示例
- Java线程中的wait, notify and notifyAll
- JAVA线程间协作:wait.notify.notifyAll
- Java 线程同步(wait、notify、notifyAll)
- java的线程通信wait(),notify(),notifyAll()
- JAVA线程间协作:wait.notify.notifyAll
- 线程 wait notifyAll
- 线程wait-notify-notifyAll
- android的volley框架使用日志1
- Python学习
- eoiioe linux下解压命令大全
- 网摘》控件数组
- 利用eclipse将java源码打包成jar【图】
- java线程之wait、notifyAll
- block和指针函数
- Linux 0.1 版本内核 setup.s 代码解析
- 一个不断提出的问题:Linux下JDK到底应该安装在哪儿?
- Linux test命令
- 【C++】浙大PAT (Basic Level)1020. 月饼 (25)
- 复制对象(二)<NSCopying>协议和属性的copy特性
- 1.1CPU
- MSSQL查看存储过程定义