`

认识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

分享到:
评论

相关推荐

    生产者消费者问题操作系统课程设计思路.ppt

    生产者消费者问题操作系统课程设计思路 本资源是关于操作系统课程设计的生产者消费者...本资源提供了生产者消费者问题操作系统课程设计的思路和解决方案,涵盖了信号量、管程、Java中的wait()和notify()等重要知识点。

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

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

    Java雷电游戏,主要用SWING和Java的进程,纯Java代码写的,主要为开发人员对Java线程的认识

    开发者可以通过研究游戏源码了解如何创建和启动线程,以及如何使用synchronized关键字和wait/notify机制实现线程间的通信与同步,以确保游戏运行的稳定性和响应速度。 此外,Java的事件驱动模型在处理用户交互时也...

    认识Thread和Runnable

    * 当线程调用 wait() 方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用 notify() 或 notifyAll() 方法才能被唤醒。...

    Java课件(初学者)

    讲解线程的基本概念,如何创建和管理线程,以及同步和互斥机制,如synchronized关键字和wait/notify机制。 第十章:Java高级特性 深入探讨枚举、注解、反射、动态代理等Java的高级特性,为后续的进阶学习打下基础。...

    Java语言入门书籍

    第八章会讲解Java的多线程编程,包括线程的创建、同步机制(如synchronized关键字和wait/notify机制)以及线程池,这是构建高效并发程序的关键知识。 第九章通常会涉及一些高级主题,如反射、注解、JNI(Java ...

    JavaSE课程,幻影灯片课程

    6. **线程**:了解多线程的概念,如何创建和管理线程,以及同步机制如synchronized关键字和wait/notify机制。 7. **反射机制**:通过反射,可以在运行时动态地获取类的信息并操作对象,这是许多高级Java应用的基础...

    多线程】_认识多线程

    4. 线程通信:线程间需要通过某种方式交换信息,如wait()、notify()、notifyAll()方法,或者使用BlockingQueue等高级并发工具。 5. 线程池:为了更好地管理线程,通常会使用线程池,如Java的ExecutorService。它能...

    JVM中编译Class、内存回收、多线程原理和使用

    线程间通信则可以通过wait/notify、join、中断等机制实现。 5. Java源码编译(Java Source Code Compilation): Java源码首先由编译器(如javac)处理,经历词法分析、语法分析、注解处理和语义分析等阶段,最终...

    深入浅出JAVA(个人觉得是一本挺不错的书)

    对于高级主题,如多线程和并发编程,书中的内容可能会涵盖线程的创建与同步,包括synchronized关键字、volatile变量、wait/notify机制,以及并发集合如ConcurrentHashMap和CopyOnWriteArrayList的使用。 最后,书籍...

    Java程序设计教程-习题答案.rar

    理解线程的基本概念,如同步、互斥和死锁,以及如何使用synchronized关键字和wait/notify机制,是处理高性能和高并发应用的关键。 最后,Java的API(Application Programming Interface)非常丰富,包括了用于网络...

    黑马程序员_(适合初学者入门的Java基础视频)

    8. **多线程**:介绍线程的概念,讲解如何创建和控制线程,以及同步机制,如synchronized关键字和wait/notify机制。 9. **Java API和类库**:通过实例演示如何使用Java标准库中的各种类,如Date、Calendar、Math等...

    Java基础教学汇总最新2018

    线程和并发编程也是现代Java开发的重要组成部分,教程可能会介绍线程的创建和同步机制,如synchronized关键字、wait/notify机制和并发工具类。 Java集合框架是另一个重要的主题,包括ArrayList、LinkedList、...

    《21天学通java 6(英文版)》-电子书下载(PDF)

    7. **多线程**:了解线程的概念,如何创建和管理线程,以及同步机制如synchronized关键字和wait/notify机制。 8. **Java GUI编程**:通过Swing或JavaFX库,学习如何构建图形用户界面,包括组件的使用、布局管理器和...

    Java核心技术 卷1 基础知识 原书第9版

    8. **多线程编程**:介绍Java中的线程概念,如何创建和管理线程,同步机制(如synchronized关键字和wait/notify机制),以及线程池的使用。 9. **输入/输出与文件操作**:讲解Java I/O流的体系结构,文件读写操作,...

    李兴华j2se不分的所有笔记

    - 线程常用操作方法笔记:讲解了线程的启动、同步、通信以及线程间的协作方法,如wait、notify和join等。 - 线程操作范例笔记:通过实例展示了如何在Java中实现和管理线程,包括守护线程、线程池等高级用法。 五...

    Java基础教程

    本章将介绍如何创建和管理线程,以及同步机制,如synchronized关键字和wait/notify机制。 通过这12章的学习,初学者可以对Java编程有全面的认识,并具备编写简单Java程序的能力。随着实践经验的积累,进阶学习Java...

    《Java程序设计大学教程》课件

    8. **多线程**:了解线程的概念,学习Thread类和Runnable接口,掌握同步机制,如synchronized关键字和wait/notify机制。 9. **反射机制**:理解Java反射的原理,学会动态加载类、创建对象、访问成员变量和方法。 ...

    head first java 中文版

    7. **线程**:理解并发编程的基本原理,学习如何创建和管理线程,以及同步机制(如synchronized关键字和wait/notify机制)。 8. **泛型**:了解泛型的用途,如何在类、接口和方法中使用泛型,以提高代码的类型安全...

Global site tag (gtag.js) - Google Analytics