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

关于wait 和 notifyall的实用方法

 
阅读更多

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方法的使用示例

    ### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    Java wait和notifyAll实现简单的阻塞队列

    需要注意的是,在使用 wait 和 notifyAll 方法时,必须先获取到对象锁,否则会抛出 IllegalMonitorStateException 异常。此外,wait 方法也可以使调用线程进入等待状态,而不需要释放对象锁。 此外,我们还可以使用...

    Java通过wait()和notifyAll()方法实现线程间通信

    本篇将详细介绍如何使用`wait()`和`notifyAll()`方法实现线程间的通信,并结合给定的代码实例进行分析。 1. **`wait()`方法**: 当一个线程调用对象的`wait()`方法时,该线程会释放当前对象的锁,并进入等待状态。...

    如何在Java中正确使用 wait, notify 和 notifyAll

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    Java 中Object的wait() notify() notifyAll()方法使用

    Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和...wait()、notify()和notifyAll()方法是Java并发编程中非常重要的概念,理解它们的使用方法和价值是非常重要的。

    Java的wait(), notify()和notifyAll()使用心得

    4. **死锁和饥饿**:虽然`wait()`, `notify()`, `notifyAll()` 提供了线程间的通信,但不当使用可能导致死锁(两个或更多线程互相等待对方释放资源而无法继续执行)或饥饿(某些线程一直无法获取资源而无法执行)的...

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

    sleep() 方法和 wait() 方法的区别 sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,...

    Java多线程中wait、notify、notifyAll使用详解

    例如,在生产者-消费者模型中,生产者线程可以使用wait()方法等待消费者线程的唤醒,而消费者线程可以使用notify()或notifyAll()方法唤醒生产者线程。 wait、notify、notifyAll方法是Java多线程编程中非常重要的...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要...此外,`wait()`方法的使用总是伴随着`synchronized`块或方法,确保了锁的正确管理和释放,从而保障了多线程程序的正确性和稳定性。

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

    wait方法可以让当前线程暂时放弃对象锁,让其他线程使用,而sleep和suspend方法不能做到这一点。 结论 在Java多线程编程中,wait和notify是两个非常重要的方法,它们用于线程之间的通信和同步。wait方法用于让当前...

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    - Java提供了java.util.concurrent和java.util.concurrent.atomic包,其中包含了一些线程安全的类和方法,它们不依赖于synchronized实现线程安全。 5. **示例分析**: - 提供的Account类示例展示了如何使用...

    Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)

    在本节中,我们将详细介绍wait()、notify()和notifyAll()方法的使用和实现原理。 wait()方法 wait()方法是一个对象的方法,用于使当前线程等待该对象的锁定,以便其他线程可以获取该锁定并继续执行。当一个线程...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...

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

    本文将深入探讨`wait()`方法的工作原理、使用场景以及注意事项。 `wait()`方法的主要功能是让当前线程进入等待状态,释放它所持有的锁资源,直到其他线程调用同一对象的`notify()`或`notifyAll()`方法唤醒该线程。...

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    Java多线程wait和notify

    需要注意的是,`wait()`、`notify()` 和 `notifyAll()` 必须在同步块或同步方法中调用,以避免出现 `IllegalMonitorStateException`。此外,`InterruptedException` 在 `wait()` 中应该被妥善处理,通常是重新抛出或...

    Java notify和notifyAll的区别和相同

    Java中的`notify`和`notifyAll`是多线程编程中的关键方法,它们用于线程间的通信,特别是在处理同步机制时。这两个方法都是在`Object`类中定义的,因此可以应用于任何Java对象。 首先,我们需要理解Java的同步机制...

    多线程sleep,yield,wait区别

    `sleep`, `yield`, 和 `wait` 是 Java 中用于线程管理的三个重要方法,它们各自有着不同的功能和用途。理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond...

Global site tag (gtag.js) - Google Analytics