其实,在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级的,而第一种方法是程序级的,理论上来说,后一种要更高效。
分享到:
相关推荐
wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...
Object类wait及notify方法原理实例解析 Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于...
当一个线程执行到`wait()`方法时,它会释放当前持有的锁并进入等待状态,直到其他线程调用同一锁上的`notify()`或`notifyAll()`方法唤醒。`wait()`方法还有两个重载版本:`wait(long timeout)`和`wait(long timeout,...
`ThreadA`作为主程序启动了一个`ThreadB`实例,而`ThreadB`则负责计算累加总和并最终通知`ThreadA`完成计算任务。 - **`ThreadA`类**: - 在`main`方法中创建并启动`ThreadB`对象`b`。 - 使用`synchronized`...
Java中的多线程协同工作是通过一系列的同步机制来实现的,其中wait、notify和notifyAll是基于对象监视器的同步原语。这些方法在Java的Object类中定义,主要用于线程间的通信和协作,确保资源的安全访问。下面将详细...
Java中的`Object`类提供了`wait()`方法,这是Java多线程编程中一个至关重要的功能,它与`notify()`和`notifyAll()`一起用于线程间的协作。`wait()`方法主要用于实现线程的等待和唤醒机制,允许线程在特定条件下暂停...
wait()方法是Object类中的一个方法,它使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法。wait()方法将当前线程放入该对象的等待队列中,直到其他线程调用notify()或notifyAll()方法将其唤醒。...
线程通过调用`wait()`方法进入等待状态,`notify()`会随机选择一个等待的线程并唤醒。 8. **notifyAll()**: 唤醒所有等待在此对象监视器上的线程。相比`notify()`,它会唤醒所有线程,而不是仅唤醒一个。 9. **...
- `wait()` 方法是 `java.lang.Object` 类的一个实例方法,它只能在同步块或同步方法中使用,因为它涉及到对象锁的管理。当一个线程调用对象的 `wait()` 方法时,它会释放当前对象的锁,然后进入该对象的等待池,...
* sleep()方法是Thread类的一个静态方法,而wait()方法是Object类的一个方法。 * sleep()方法使线程进入休眠状态,而wait()方法使线程释放对象锁,进入等待状态。 * sleep()方法不释放对象锁,而wait()方法释放对象...
在Java中,Object类还提供了其他一些方法,例如wait、notify、notifyAll等方法。这些方法都是线程相关的,用于线程之间的通信和同步。 在实际编程中,我们经常需要重写Object类中的方法,例如equals和hashCode方法...
1. **对象的创建与类型转换**:Java中的每一个对象都是Object类的实例,因此,当我们创建任何类的实例时,实际上也是在创建一个Object类型的实例。同时,由于所有类都继承自Object,因此在必要的时候,我们可以进行...
- wait()、notify()和notifyAll():这些方法存在于Object类中,用于线程间的通信。在线程A调用wait()后,A会被阻塞并释放锁,等待其他线程调用notify()或notifyAll()唤醒。使用这些方法时,必须在同步块或同步方法中...
"Java从JDK源码角度对Object进行实例分析" Java中的Object类是所有类的父类,也就是说Java中的所有类都是直接或者间接继承自Object类。Object类体现了面向对象编程(OOP)的四大特性:多态、继承、封装、抽象。...
wait、notify和notifyAll是Object类的三个方法,它们用于线程间的通讯。这些方法必须在同步环境中(即synchronized代码块或方法)使用,否则会抛出`IllegalMonitorStateException`。 1. **wait()**:让当前持有锁的...
1. 丢失的信号:如果线程在调用`wait()`之前错过了`notify()`,那么它可能永远不会被唤醒,除非有其他的`notify()`调用。 2. 假唤醒:即使没有对应的`notify()`调用,线程也可能会因系统中断或其他原因而从`wait()`...
本实例着重讲解如何运用Java多线程中的wait、notify和notifyAll这三个关键字,它们是Java对象锁机制的一部分,用于线程间的通信和同步。 1. **线程的创建与启动** - 继承`Thread`类:创建一个新的类,该类继承自`...
`wait()`方法是Object类的一个实例方法,主要用于同步线程间的通信。当一个线程调用了一个对象的`wait()`方法后,该线程将会释放该对象的锁,并进入等待状态直到被唤醒。这使得其他线程有机会获取该对象的锁并执行...
2. **wait()和notify()**:这是Java中Object类提供的两个方法,用于线程同步。一个线程调用对象的wait()方法后会释放该对象的锁并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()唤醒它。这种方式需要...
`synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...