`

线程学习二,notify和wait实现消费者-生产者同步问题

阅读更多
/*
生产者-消费者的问题,对象有学生,家长,银行,ATM取款机
 * 实现,学生在学校用钱,钱用光了用银行卡去ATM取款,卡上有钱时把钱取出来消费,卡上没有钱时学生打电话通知家长,家长到银行存钱,
 * 银行同步把存入的钱反映到银行卡上,家长通知学生钱已经打过去了,学生接到家长的通知后,就去ATM机取钱。钱取到后,学生就去消费,
 * 当钱用完时,学生就 通知家长 去存钱。
 * 对象有:学生,家长,银行(包括银行卡、ATM机)
 */

package threadTest;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Administrator
 */
public class ProducerCustomer {
   static class Bank {
        static double money = 0;

        public double getMoney() {
            return money;
        }

        public void setMoney(double money) {
            this.money = money;
        }
    }
    Bank ban = new Bank();//加同步锁的对象
    class Student implements Runnable{
        public void run(){
               
            synchronized(ban){
                 while(true){
                while(ban.getMoney() > 0){
                    try {
                        System.out.println("学生被告知钱已经打了,学生去取钱消费");
                        Thread.sleep(2000);
                        moneyUsering();
                        moneyUserOut();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(ProducerCustomer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                while(ban.getMoney()==0){
                    moneyUserOut();
                }
               
            }
            }
        }
        public void moneyUsering(){
            while(ban.getMoney() !=0){
                    System.out.println("卡里还有"+ban.getMoney()+"钱");
                    double newMoney = ban.getMoney()-100;
                    ban.setMoney(newMoney);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(ProducerCustomer.class.getName()).log(Level.SEVERE, null, ex);
                }
                }
        }
        public void moneyUserOut(){
            while(ban.getMoney() == 0){
                    System.out.println("学生发现钱花光了,通知家长去打钱"+ban.getMoney());
                    ban.notify();//钱用光时,通知家长线程解锁
                       try {
                           System.out.println("等待家长打钱");
                           Thread.sleep(3000);
                           ban.wait();//当前线程进入阻塞状态
                           System.out.println("--------");
                    } catch (InterruptedException ex) {
                        Logger.getLogger(ProducerCustomer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
    }
    class Parents implements Runnable{
        public void run(){
            synchronized(ban){
                while(true){
                    while(ban.getMoney() == 0){
                        ban.setMoney(500);
                        System.out.println("家长去银行存入了500元钱"+ban.getMoney());

                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(ProducerCustomer.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        System.out.println("家长通知学生钱已经存进去了,等待学生通知要钱");
                        ban.notify();//解锁学生线程
                        try {
                            ban.wait();//当前线程进入等待状态
                        } catch (InterruptedException ex) {
                            Logger.getLogger(ProducerCustomer.class.getName()).log(Level.SEVERE, null, ex);
                        }
                   }
                }
                
            }
        }
    }
    
    public static void main(String[] args) {
        ProducerCustomer pc = new ProducerCustomer();
        Student stu = pc.new Student();
        Parents par = pc.new Parents();
        Thread thStu = new Thread(stu);
        Thread thPar = new Thread(par);
        thStu.start();
        thPar.start();
    }
}

分享到:
评论

相关推荐

    Java 线程间通信,生产者与消费者模型

    使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)

    wait_notify_demo

    使用Java多线程的wait和notify方法实现最简单的生产者消费者模式

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

    举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,...

    java多线程(生产者与消费者)

    生产者消费者模式是java多线程经典的安全,它用到了同步,资源共享,wait,notify等技术。

    锁、生产者与消费者.pdf

    生产者消费者详解wait():执行该方法的线程对象,释放同步锁,JVM会把该线程放到等待池中,等待其他线程唤醒该线程 notify():执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待(注意锁池和...

    生产者消费者JAVA课程设计

    //下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象 Producer p1 = new Producer(stack,ce); new Thread(p1).start();//生产者线程启动 Consumer c1 = new Consumer(stack,ce); new Thread(c1)....

    java—多线程的通信、生产者与消费者模式

    一、重点知识 isDaemon 判断是否为守护线程。...如果没有线程处于wait状态,调用notify此时是一个空唤醒 stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程进去调用他的一个方法

    用Python的线程来解决生产者消费问题的示例

    我们将使用Python线程来解决Python中的生产者—消费者问题。这个问题完全不像他们在学校中说的那么难。 如果你对生产者—消费者问题有了解,看这篇博客会更有意义。 为什么要关心生产者—消费者问题: 可以帮你更好...

    Java实现生产者消费者问题

     生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:  生产者消费者...

    多线程实例 有讲解

    多线程实例 生产者、消费者有讲解 下面是其中一小部分代码 public synchronized void putShareChar(char c) { // 通知消费者已经生产,可以消费 if (isProduced) { // 如果产品还未消费,则生产者等待 try { ...

    java模拟实现PV操作

    java模拟实现PV操作 利用线程的wait和notify方法实现PV操作实现生产者与消费者问题

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

    三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目分析2.2.3 我的答案 源码地址:https://github.com/nieandsun/concurrent-study.git 1 wait、notify、...

    Java-线程状态和等待唤醒机制和线程池

    创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待) 创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子 注意: ...

    Java多线程的等待唤醒机制代码演示通俗易懂

    生产者和消费者是一个十分经典的多线程协作模式 **常见方法:** - void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程

    python条件变量之生产者与消费者操作实例分析

    本文实例讲述了python条件变量之生产者与消费者操作。分享给大家供大家参考,具体如下: 互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Python还提供了Condition对象。Condition被称为条件变量,除了提供与...

    c++ linux系统下notify的使用

    1.notify的使用 2. wait的使用 3. linux系统下的开发 4.多线程通信 5. 生产者和消费者模式

    Java并发编程原理与实战

    通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与...

    高级开发并发面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的并发题目以及答案 目录 并发 常说的并发问题是哪些;资源竞争、死锁、事务、可见性 ...实现一个阻塞队列(用Condition写生产者与消费者就)?BlockingQueue

    Day 22多线程、线程通信、线程池和Lambda表达式

    Day 22 Author:ScorpioDong 1. 多线程 1.1 WAITING(无限等待) 当某一线程被执行wait()方法,需要等待其他线程...现在存在两个完全无关的线程,生产者和消费者,但是商品会作为他们两者之间的共享资源。 生产者和消费

    java多线程通信之等待唤醒机制

    典型实例有生产者和消费者,本文也通过实例来分析线程等待唤醒机制。  1、相关API介绍  public final void notify()  唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会任意选择唤醒...

Global site tag (gtag.js) - Google Analytics