`
sharp-fcc
  • 浏览: 111496 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

object wait notify 实例一则

阅读更多

       其实,在Java中任何一个对象均有一个锁,而syhchronized同步块在调用时会检测该对象的锁定情况,主过程和子过程两个线程竞争同一对象时,在主过程中调用wait()方法,子过程即可进入synchronized同步块。而当子过程调用notify方法时,主过程又重新获得了对象锁,继续执行下去。实现如下:

package com.unclepeng.test;

//主过程
public class MainProgross2 {

 private static byte[] sign = new byte[0];
 
 public static void main(String[] args) {
  SubProgross subProgross = new SubProgross();
  Thread subThread = new Thread(subProgross);
  long currentTime = System.currentTimeMillis();
  System.out.println("execute main progross!");
  subThread.start();
  synchronized(sign){
   System.out.println("main progross get lock!");
   try {
    sign.wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  System.out.println("leave main progross!");
  long endTime = System.currentTimeMillis();
  System.out.println("total time: " + (endTime - currentTime));
 }
 
 //子过程
 static class SubProgross implements Runnable{
  public void run() {
   System.out.println("execute sub progross!");
   try {
    Thread.sleep(3000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   synchronized(sign){
    System.out.println("sub progross get lock!");
    sign.notify();
   }
   System.out.println("leave sub progross!");
  }
 
 }

}

其实在Java的Object类中notifyAll、notify、wait方法均为native方法,在windows中是通过外部的dll来实现其内部,可以说Object的notify及wait等操作是JVM级的,而第一种方法是程序级的,理论上来说,后一种要更高效。

分享到:
评论

相关推荐

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

    wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...

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

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

    java中几个notify、wait使用实例

    当一个线程执行到`wait()`方法时,它会释放当前持有的锁并进入等待状态,直到其他线程调用同一锁上的`notify()`或`notifyAll()`方法唤醒。`wait()`方法还有两个重载版本:`wait(long timeout)`和`wait(long timeout,...

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

    `ThreadA`作为主程序启动了一个`ThreadB`实例,而`ThreadB`则负责计算累加总和并最终通知`ThreadA`完成计算任务。 - **`ThreadA`类**: - 在`main`方法中创建并启动`ThreadB`对象`b`。 - 使用`synchronized`...

    wait,notify等线程知识.pdf

    Java中的多线程协同工作是通过一系列的同步机制来实现的,其中wait、notify和notifyAll是基于对象监视器的同步原语。这些方法在Java的Object类中定义,主要用于线程间的通信和协作,确保资源的安全访问。下面将详细...

    java Object wait方法详细介绍

    Java中的`Object`类提供了`wait()`方法,这是Java多线程编程中一个至关重要的功能,它与`notify()`和`notifyAll()`一起用于线程间的协作。`wait()`方法主要用于实现线程的等待和唤醒机制,允许线程在特定条件下暂停...

    Java多线程通信wait()和notify()代码实例

    wait()方法是Object类中的一个方法,它使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法。wait()方法将当前线程放入该对象的等待队列中,直到其他线程调用notify()或notifyAll()方法将其唤醒。...

    JAVA之Object类所有方法

    线程通过调用`wait()`方法进入等待状态,`notify()`会随机选择一个等待的线程并唤醒。 8. **notifyAll()**: 唤醒所有等待在此对象监视器上的线程。相比`notify()`,它会唤醒所有线程,而不是仅唤醒一个。 9. **...

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

    - `wait()` 方法是 `java.lang.Object` 类的一个实例方法,它只能在同步块或同步方法中使用,因为它涉及到对象锁的管理。当一个线程调用对象的 `wait()` 方法时,它会释放当前对象的锁,然后进入该对象的等待池,...

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

    * sleep()方法是Thread类的一个静态方法,而wait()方法是Object类的一个方法。 * sleep()方法使线程进入休眠状态,而wait()方法使线程释放对象锁,进入等待状态。 * sleep()方法不释放对象锁,而wait()方法释放对象...

    java中object类实例分析

    在Java中,Object类还提供了其他一些方法,例如wait、notify、notifyAll等方法。这些方法都是线程相关的,用于线程之间的通信和同步。 在实际编程中,我们经常需要重写Object类中的方法,例如equals和hashCode方法...

    详解Java中Object 类的使用.rar

    1. **对象的创建与类型转换**:Java中的每一个对象都是Object类的实例,因此,当我们创建任何类的实例时,实际上也是在创建一个Object类型的实例。同时,由于所有类都继承自Object,因此在必要的时候,我们可以进行...

    java 多线程并发实例

    - wait()、notify()和notifyAll():这些方法存在于Object类中,用于线程间的通信。在线程A调用wait()后,A会被阻塞并释放锁,等待其他线程调用notify()或notifyAll()唤醒。使用这些方法时,必须在同步块或同步方法中...

    Java从JDK源码角度对Object进行实例分析

    "Java从JDK源码角度对Object进行实例分析" Java中的Object类是所有类的父类,也就是说Java中的所有类都是直接或者间接继承自Object类。Object类体现了面向对象编程(OOP)的四大特性:多态、继承、封装、抽象。...

    多线程同步和通讯完整示例

    wait、notify和notifyAll是Object类的三个方法,它们用于线程间的通讯。这些方法必须在同步环境中(即synchronized代码块或方法)使用,否则会抛出`IllegalMonitorStateException`。 1. **wait()**:让当前持有锁的...

    java 多线程-线程通信实例讲解

    1. 丢失的信号:如果线程在调用`wait()`之前错过了`notify()`,那么它可能永远不会被唤醒,除非有其他的`notify()`调用。 2. 假唤醒:即使没有对应的`notify()`调用,线程也可能会因系统中断或其他原因而从`wait()`...

    java 多线程实例

    本实例着重讲解如何运用Java多线程中的wait、notify和notifyAll这三个关键字,它们是Java对象锁机制的一部分,用于线程间的通信和同步。 1. **线程的创建与启动** - 继承`Thread`类:创建一个新的类,该类继承自`...

    java sleep()和wait()

    `wait()`方法是Object类的一个实例方法,主要用于同步线程间的通信。当一个线程调用了一个对象的`wait()`方法后,该线程将会释放该对象的锁,并进入等待状态直到被唤醒。这使得其他线程有机会获取该对象的锁并执行...

    JAVA100例之实例64 JAVA线程间通讯

    2. **wait()和notify()**:这是Java中Object类提供的两个方法,用于线程同步。一个线程调用对象的wait()方法后会释放该对象的锁并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()唤醒它。这种方式需要...

    synchronized用法大全实例

    `synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...

Global site tag (gtag.js) - Google Analytics