`

认识wait()和notify()

    博客分类:
  • J2SE
阅读更多

本文用一个【做饭者】和一个【打扫者】并发访问【卫生间】的例子来探讨Object.wait()和Object.notify()的用法。

wait()和notify()的涵义:

1、必须在synchronized 块中

2、这两个方法属于Object对象,而不是属于线程,这一点不要混淆了

3、wait()的对象是当前线程;notify()的调用者是当前线程,操作对象是正在wait的线程。


 

package org.eleaf.j2se.th;

 

 

import java.io.PrintStream;

 

 

 

public class ThreadTest2 {

 

public static void main(String[] args) {

 

Tt2Wc tw = new Tt2Wc();

 

Tt2Cook tc = new Tt2Cook(tw);

 

Tt2Sweep ts = new Tt2Sweep(tw);

 

Thread t1 = new Thread(tc, tc. name );

 

Thread t2 = new Thread(ts, ts. name );

 

t1.start();

 

t2.start();

 

}

 

}

 

 

 

// 卫生间

 

class Tt2Wc {

 

// 假设做饭和打扫卫生都要用到卫生间的水。

 

boolean isWaterOpened = false ;

 

 

// 使用卫生间

 

public void useWc( int sc) throws InterruptedException {

 

Thread t = Thread.currentThread ();

 

 

// 这段代码使得两个线程在控制台打印信息的颜色不同。其中 打扫者 打印信息显示为红色。

 

PrintStream pw = null ;

 

if ( " 打扫者 " .equals(t.getName())){

 

pw = System. err ;

 

} else {

 

pw = System. out ;

 

}

 

 

// 如果卫生间的水已经有人在用,就在门外等待。

 

if ( isWaterOpened ){

 

pw.println(Thread.currentThread ().getName() + " 在卫生间外面等候 " );

 

 

synchronized ( this ) {

 

wait();

 

}

 

 

}

 

 

synchronized ( this ) {

 

changeWaterState();

 

pw.println(t.getName() + " 现在使用卫生间 . 持续 " + sc/1000 + " " );

 

// sleep() 方法来简化使用卫生间的过程。

 

Thread.sleep (sc);

 

pw.println(t.getName() + " 使用卫生间结束 ." );

 

changeWaterState();

 

// 通知在门外等待的人可以进来用水了。

 

notify();

 

}

 

 

 

}

 

private void changeWaterState() {

 

isWaterOpened = ! isWaterOpened ;

 

// System.out.println("water state:" + isWaterOpened);

 

}

 

}

 

 

 

// 做饭

 

class Tt2Cook implements Runnable {

 

private Tt2Wc tw ;

 

public String name = " 做饭者 " ;

 

public Tt2Cook(Tt2Wc tw){

 

this . tw = tw;

 

}

 

public void run(){

 

try {

 

System. out .println( name + " 开始了 ..." );

 

// 使用卫生间

 

tw .useWc(10000);

 

System. out .println( name + " 去忙别的事了 ++++++." );

 

tw .useWc(12000);

 

System. out .println( name + " 去忙别的事了 ++++++." );

 

tw .useWc(11000);

 

System. out .println( name + " 去忙别的事了 ++++++." );

 

tw .useWc(11000);

 

 

System. out .println( name + " 关闭 ." );

 

} catch (InterruptedException ie){

 

ie.printStackTrace();

 

}

 

 

}

 

}

 

 

// 打扫卫生

 

class Tt2Sweep implements Runnable {

 

public String name = " 打扫者 " ;

 

private Tt2Wc tw ;

 

public Tt2Sweep(Tt2Wc tw){

 

this . tw = tw;

 

}

 

public void run() {

 

 

try {

 

// 打扫者信息显示为红色 //

 

System. err .println( name + " 开始了 ..." );

 

// 使用卫生间

 

tw .useWc(10000);

 

System. err .println( name + " 去忙别的事了 ++++++." );

 

tw .useWc(10000);

 

System. err .println( name + " 去忙别的事了 ++++++." );

 

tw .useWc(10000);

 

System. err

分享到:
评论

相关推荐

    java多线程设计模式详解(PDF及源码)

    wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...

    Java并发编程原理与实战

    使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类...

    java并发编程

    第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...

    龙果 java并发编程原理实战

    第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...

    Java 并发编程原理与实战视频

    第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...

    龙果java并发编程完整视频

    第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...

    java基础案例与开发详解案例源码全

    12.4.3 wait和notify方法320 12.4.4 死锁322 12.5 集合类的同步问题323 12.5.1 使用synchronized同步块324 12.5.2 使用集合工具类同步化集合类对象324 12.5.3 使用JDK5.0后提供的并发集合类324 12.6 用Timer类调度...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    12.2.2 认识接口的代码组成 340 12.2.3 什么是接口 341 12.2.4 使用接口仅需一步——实现接口 342 12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    12.2.2 认识接口的代码组成 340 12.2.3 什么是接口 341 12.2.4 使用接口仅需一步——实现接口 342 12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 ...

    java面试题

    wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? ...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26...

Global site tag (gtag.js) - Google Analytics