`
z75148885
  • 浏览: 191359 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

同步方法中使用wait(),notify(),notifyAll()

阅读更多

同步方法中使用wait(),notify(),notifyAll()

       wait(),notify(),notifyAll()方法都是Object类中的final方法,被所有类继承,不能重写。当一个线程使用的同步方法中用到某个变量。而次变量需要其它线程修改后才能符合本线程的需要,那么可以在本线程中使用wait()方法。它中断线程的执行,使本线程处于等待状态,让出CPU使用权,并让其它线程使用这个同步方法,其它线程在使用这个同步方法时若不需要等待,那么它使用完这个同步方法后,要用notifyAll()方法通知所有的由于使用该同步方法而处于等待的线程结束等待。层中断的线程就会重新排队等待CPU资源,以便从刚才中断处继续执行这个同步方法。(如果用notify()方法,那么只是通知处于等待状态的线程中的某一个结束等待)

* 三人排队买票,票价5,初始售票员只有一张5.a:20;b:10;C:5

* @author Young

* class TestConmunicate

*/

public class TicketSell {

       int fiveNum = 1,tenNum = 0,twentyNum = 0;

       TicketSell() {

       }

       public synchronized void sellTicket(int receiveMoney){

              if (receiveMoney == 5) {

                     fiveNum += 1;

                     System.out.println(Thread.currentThread().getName()+" 给我5块钱,这是您的入场券\n");

              } else if (receiveMoney == 10){

                     while (fiveNum < 1) {

                            try {

                                   System.out.println(Thread.currentThread().getName()+" 靠边站");

                                   wait();

                                   System.out.println(Thread.currentThread().getName()+" 结束等待");

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                     }

                     fiveNum -= 1;

                     tenNum += 1;

                     System.out.println(Thread.currentThread().getName()+" 给我10元钱,找你5,这是你的入场券!");

              }else if (receiveMoney == 20) {

                     while (fiveNum < 1 || tenNum < 1) {

                            try {

                                   System.out.println(Thread.currentThread().getName()+" 靠边站");

                                   //wait();

                                   Thread.currentThread().wait();

                                   System.out.println(Thread.currentThread().getName()+" 结束等待!");

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                     }

                     fiveNum -= 1;

                     tenNum -= 1;

                     twentyNum += 1;

                     System.out.println(Thread.currentThread().getName()+" 给我20,找你15,这是你的入场券!");

              }

              notify();

       }

}

分享到:
评论

相关推荐

    Java 同步方式 wait和notify/notifyall

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

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

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

    wait和notifyAll方法的使用示例

    在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者消费者模型中的资源竞争问题。本文将结合具体的代码...

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

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

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

    - load()方法中使用了wait(),确保线程在等待条件满足时释放锁,并在被唤醒后重新检查条件。 总之,Java多线程同步通过wait()、notify()和notifyAll()等方法,配合synchronized关键字,实现了对共享资源的访问控制...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

    java中几个notify、wait使用实例

    `wait()`、`notify()`和`notifyAll()`方法是Java中实现线程同步的关键工具。正确使用它们可以有效避免线程间的竞争条件和死锁问题,同时也能实现线程间的高效通信。在实际开发中,应根据具体的应用场景选择合适的...

    wait_notify_demo

    在Java中,`wait()`、`notify()`和`notifyAll()`方法都是与对象锁相关的,它们用于控制线程的同步。使用这些方法的前提是线程必须拥有对象的监视器,也就是对象锁。这是通过在synchronized块或方法中调用它们来实现...

    Java多线程wait和notify

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

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

    1. **锁的持有**:调用`wait()`, `notify()`, 或 `notifyAll()` 必须在同步块(`synchronized` block)或同步方法中进行,即当前线程必须持有对象的锁。否则,会抛出`IllegalMonitorStateException`异常。这是因为这些...

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

    在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有的对象锁,而 notifyAll 方法则会去唤醒当前...

    等待机制与锁机制wait notify

    本文将深入探讨`wait`、`notify`以及`notifyAll`这三个关键字的使用及其背后的原理,帮助你理解如何在实际编程中有效地利用它们来解决线程同步问题。 首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置...

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

    Java多线程基础中的线程等待与唤醒是一种常见的线程协作机制,通过wait()、notify()和notifyAll()方法来实现线程之间的同步和通信。在本节中,我们将详细介绍wait()、notify()和notifyAll()方法的使用和实现原理。 ...

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

    - **权限和锁**:`wait()`, `notify()`和`notifyAll()`需要在同步上下文中使用,而`sleep()`则不需要。 - **资源释放**:`wait()`会释放对象锁,而`sleep()`不会。 - **唤醒机制**:`wait()`需要其他线程调用`notify...

    Java的sychronized、wait和notify范例

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

    wait,notify等线程知识.pdf

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

    主线程去控制子线程wait与notify

    在Java中,使用`wait()`, `notify()`, 和 `notifyAll()`必须在同步块或者同步方法中,因为它们涉及到对共享资源的访问。这是为了避免出现竞态条件,确保只有一个线程在执行这些操作。 主线程控制子线程的`wait()`和...

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

    - 在`run`方法中使用`synchronized(this)`确保对`this`对象的操作是同步的。 - 计算累加总和并在每次累加后输出当前总和。 - 调用`notify()`方法唤醒正在等待的线程。 #### `synchronized`关键字 `Synchronized...

    Java notify和notifyAll的区别和相同

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

    浅谈java多线程wait,notify

    在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在...

Global site tag (gtag.js) - Google Analytics