import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* User: guohaozhao
* Date: 13-7-11 10:44
*/
public class multiThreadTest {
private static final byte[] lock = new byte[0];
private static volatile boolean stop = false;
private static class Notifier implements Runnable {
@Override
public void run() {
try {
System.out.println("Notifier is started ...");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
synchronized (lock) {
lock.notifyAll();
System.out.println("notified all !!");
}
}
}
private static class Waiter implements Runnable {
@Override
public void run() {
synchronized (lock) {
try {
System.out.println(Thread.currentThread().getName() + "waiting ...");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
while (!stop) {
System.out.println(Thread.currentThread().getName() + "doing !!!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
}
public static void main(String... args) {
CountDownLatch countDownLatch = new CountDownLatch(1);
Thread thread = new Thread(new Notifier());
thread.start();
for (int i = 0; i < 3; i++) {
Thread _thread = new Thread(new Waiter());
_thread.start();
}
try {
countDownLatch.await(10 * 1000, TimeUnit.MILLISECONDS);
stop = true;
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
System.out.println("test done !!!");
}
}
执行结果:
Notifier is started ...
Thread-2waiting ...
Thread-3waiting ...
Thread-4waiting ...
notified all !!
Thread-4doing !!!
Thread-3doing !!!
Thread-2doing !!!
Thread-4doing !!!
Thread-2doing !!!
Thread-3doing !!!
Thread-2doing !!!
Thread-3doing !!!
Thread-4doing !!!
test done !!!
分享到:
相关推荐
### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
wait()、notify()和notifyAll()方法1---马克-to-win java视频
需要注意的是,在使用 wait 和 notifyAll 方法时,必须先获取到对象锁,否则会抛出 IllegalMonitorStateException 异常。此外,wait 方法也可以使调用线程进入等待状态,而不需要释放对象锁。 此外,我们还可以使用...
本篇将详细介绍如何使用`wait()`和`notifyAll()`方法实现线程间的通信,并结合给定的代码实例进行分析。 1. **`wait()`方法**: 当一个线程调用对象的`wait()`方法时,该线程会释放当前对象的锁,并进入等待状态。...
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和...wait()、notify()和notifyAll()方法是Java并发编程中非常重要的概念,理解它们的使用方法和价值是非常重要的。
4. **死锁和饥饿**:虽然`wait()`, `notify()`, `notifyAll()` 提供了线程间的通信,但不当使用可能导致死锁(两个或更多线程互相等待对方释放资源而无法继续执行)或饥饿(某些线程一直无法获取资源而无法执行)的...
sleep() 方法和 wait() 方法的区别 sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,...
例如,在生产者-消费者模型中,生产者线程可以使用wait()方法等待消费者线程的唤醒,而消费者线程可以使用notify()或notifyAll()方法唤醒生产者线程。 wait、notify、notifyAll方法是Java多线程编程中非常重要的...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要...此外,`wait()`方法的使用总是伴随着`synchronized`块或方法,确保了锁的正确管理和释放,从而保障了多线程程序的正确性和稳定性。
wait方法可以让当前线程暂时放弃对象锁,让其他线程使用,而sleep和suspend方法不能做到这一点。 结论 在Java多线程编程中,wait和notify是两个非常重要的方法,它们用于线程之间的通信和同步。wait方法用于让当前...
- Java提供了java.util.concurrent和java.util.concurrent.atomic包,其中包含了一些线程安全的类和方法,它们不依赖于synchronized实现线程安全。 5. **示例分析**: - 提供的Account类示例展示了如何使用...
在本节中,我们将详细介绍wait()、notify()和notifyAll()方法的使用和实现原理。 wait()方法 wait()方法是一个对象的方法,用于使当前线程等待该对象的锁定,以便其他线程可以获取该锁定并继续执行。当一个线程...
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
本文将深入探讨`wait()`方法的工作原理、使用场景以及注意事项。 `wait()`方法的主要功能是让当前线程进入等待状态,释放它所持有的锁资源,直到其他线程调用同一对象的`notify()`或`notifyAll()`方法唤醒该线程。...
在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...
需要注意的是,`wait()`、`notify()` 和 `notifyAll()` 必须在同步块或同步方法中调用,以避免出现 `IllegalMonitorStateException`。此外,`InterruptedException` 在 `wait()` 中应该被妥善处理,通常是重新抛出或...
Java中的`notify`和`notifyAll`是多线程编程中的关键方法,它们用于线程间的通信,特别是在处理同步机制时。这两个方法都是在`Object`类中定义的,因此可以应用于任何Java对象。 首先,我们需要理解Java的同步机制...
`sleep`, `yield`, 和 `wait` 是 Java 中用于线程管理的三个重要方法,它们各自有着不同的功能和用途。理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond...