`
myqhit
  • 浏览: 64647 次
社区版块
存档分类
最新评论

notify,wait,sleep

    博客分类:
  • java
阅读更多

 

转载别人的http://dev.csdn.net/Develop/article/28/55640.shtm

 自版本1.0开始,J2SE就提供了wait,notify以及notifyAll方法。本文就对这三个方法进行介绍,并进行一定的分析,最后给出本人觉有问题的地方,希望对大家有所启发。
    虽然以上所说的三个方法最常出现的地方是线程的内部,但是并不意味这这些方法是Thread类的成员函数。实际上java在设计的时候就充分考虑到了同步的问题,因而在设计基础类Oject的时候就为其提供了这三个函数。这就意味着你所编写的任何类都可以使用这些方法(当然某些时候这些方法是没有意义的)。
    按照上面的说法,你肯定有这样的疑惑:既然是跟对象有关系,那为什么我看见的程序中,最常见的使用是在线程里呢?以下我就将这个问题给出答案!首先,我们要知道wait()跟sleep()本质上来说是绝对不一样的。sleep()使得一个进程进入睡眠状态,但是线程所占有的资源并没有释放。比如,你在synchronized模块(加函数锁或者对象锁)里面调用了sleep(),虽然线程睡着了而且没有使用资源,但是它依然保存着锁,别的线程依然无法调用相关的synchronized模块。而wait()就不同,它实际上了放弃了锁,将资源贡献出来,而使自己暂时离岗。这个离岗状态一直会持续到“boss“(其他的线程)调用了notify(),通知线程继续回来工作。如果你对程序框架很熟悉的话,你肯定会想到wait()和notify()的巨大作用了!!!如果你的程序不是玩具的话,你可能都需要使用到这三个函数。当前的程序大多数都是多线程的,不同的线程对应着不同功能。设计良好的软件,能够使用户在程序运行的时候,对软件的功能进行增肥和瘦身。按照笨办法,我们可以用个while不断的判断某一标志,来识别用户是否启动了某项功能。这样一来while语句的执行占用了cpu的周期,降低了性能。如果我们使用wait(),当我们需要使用某项功能的时候,只需要用notify将进程”上岗“。 java里面具体怎么做的,我们不得而知,但是我们可以推断——jre肯定在开辟了一定的空间来存放信息,使得notify找到中断位置,让线程继续运行!这可是典型的用空间换时间哟!!!值得一提的是线程里面的同步就是对这三个方法的应用!
    以下我将给出我自己编写的程序,说明怎么样用这三个方法(绝对原创哟!!!):
    文件1:WaitSyn.java
import java.lang.Thread;
import java.lang.InterruptedException;
public class WaitSyn extends Thread {
 public void run(){
  waitting();
 }
 
 public synchronized void  waitting(){
  try{
   System.out.println("Waitting");
   wait();
   System.out.println("Bingle");
   }
   catch(InterruptedException e){
   e.printStackTrace();
   }
 }
 
 public void  callup(){
  synchronized(this){
  System.out.println("In the callup()");
  notifyAll();
  }
 }
}

文件2:CallSyn.java
import java.lang.Thread;

public class CallSyn extends Thread{
 
 WaitSyn waitSyn;
 
 public CallSyn(WaitSyn input){
  waitSyn = input;
 } 
 
 public void run(){
  waitSyn.callup();
  System.out.println("In the ClassSyn");
 }

文件3:Test.java
import java.lang.InterruptedException;

public class Test{
 public static void main(String arg[]){
  WaitSyn waitSyn = new WaitSyn();
  waitSyn.start();
  CallSyn callSyn = new CallSyn(waitSyn);
  callSyn.start();
 }
}  

    程序比较简单,我不进行解释,大家应该看的懂的。我下面要对函数的时候进行,比较深层次介绍了。这是小弟的心得,如果有不对的地方,希望大家提出来,共同进步!!!

分享到:
评论

相关推荐

    深入理解Wait、Notify和Wait与sleep区别

    本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    sleep() 方法和wait()方法的区别.docx

    wait() 方法可以通过 notify 或者 notifyAll 或者指定睡眠时间来唤醒当前等待池中的线程。 sleep() 和 wait() 方法的区别 sleep() 和 wait() 方法的最大区别是: 1. sleep() 睡眠时,保持对象锁,仍然占有该锁; ...

    多线程sleep,yield,wait区别

    `sleep()` 适用于需要让线程暂时退出执行的情况,`yield()` 用于尝试平衡多个线程的执行,而 `wait/notify/notifyAll()` 则用于线程间的协作,确保资源的有效共享。理解这些方法的差异和使用场景,能帮助开发者更好...

    详解Java中wait和sleep的区别

    对于wait()方法,我们可以通过调用notify()或notifyAll()方法来唤醒线程,而对于sleep()方法,线程会在指定的时间间隔后自动唤醒。 wait()和sleep()方法都是Java多线程编程中重要的概念,它们之间的...

    一个理解wait()与notify()的例子

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

    java sleep()和wait()

    2. **线程的唤醒**:`sleep()`方法的线程在指定的时间结束后会自动恢复执行,而`wait()`方法的线程需要被其他线程显式地唤醒(`notify()`或`notifyAll()`方法)。 3. **调用位置**:`sleep()`可以在任何地方调用,而`...

    wait和sleep的区别.pdf

    流媒体知识核心概念中提到的视频封装格式和视频压缩编码标准,以及wait和sleep的区别,以下是相关的知识点: 首先,视频封装格式和视频压缩编码标准是构建流媒体技术的两大核心组件。 视频封装格式是一种存储视频...

    Sleep和Wait的区别.pdf

    ### Sleep与Wait的区别详解 #### 一、基本概念 在多线程编程中,`sleep`和`wait`是两个非常重要的方法,用于控制线程的执行和协调多个线程之间的交互。理解这两个方法的不同之处对于正确实现多线程程序至关重要。 ...

    C#中sleep和wait的区别分析

    当一个线程调用 `Wait` 方法时,它会释放当前持有的对象锁,进入等待状态,并且只有在其他线程调用相同对象的 `Notify` 或 `NotifyAll` 方法后才会被唤醒。这种方式常用于实现线程间的通信和协作,比如生产者消费者...

    java sleep和wait的解惑.docx

    ### Java中的sleep与wait详解 #### 一、概述 在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    3. **调用位置**:`wait()`, `notify()`和`notifyAll()`必须在同步环境中(同步方法或同步代码块)调用,而`sleep()`可以在任何地方调用。 4. **异常处理**:`sleep()`方法需要捕获`InterruptedException`,而`wait...

    详解Java中的sleep()和wait()的区别

    在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...

    Object类wait及notify方法原理实例解析

    Object类wait及notify方法原理实例解析 Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于...

    线程中sleep、join、yield、wait的区别

    当一个线程调用对象的 `wait()` 方法时,它会释放对象的锁并进入等待状态,直到其他线程调用 `notify()` 或 `notifyAll()` 来唤醒它。这个方法通常与 `synchronized` 关键字一起使用,以确保线程安全地访问共享资源...

    java中yieldsleep以及wait的区别.pdf

    Java中的多线程编程涉及到许多关键概念,包括`yield()`, `sleep()`, 和 `wait()`,这些都是控制线程执行的重要方法。理解它们的区别对于编写高效并发程序至关重要。 首先,`yield()`方法的作用是让当前正在执行的...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...

    wait()编程wait()编程wait()编程wait()编程

    `wait()`方法的主要功能是让当前线程进入等待状态,释放它所持有的锁资源,直到其他线程调用同一对象的`notify()`或`notifyAll()`方法唤醒该线程。这种机制使得线程间的协作变得更加有序,避免了资源的竞争和死锁的...

    JAVA线程sleep()和wait()详解及实例

    JAVA线程sleep()和wait()详解及实例 JAVA线程sleep()和wait()是两个常用的线程控制方法,用于控制线程的执行和同步。本篇文章将详细介绍JAVA线程sleep()和wait()的原理、区别和实现机制,并提供实例代码以便更好地...

Global site tag (gtag.js) - Google Analytics