`

线程学习二,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实现线程间同步与互斥生产者消费者问题

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

    java多线程实现生产者和消费者

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

    用多线程同步方法解决生产者-消费者问题

    总的来说,解决生产者-消费者问题需要深入理解线程同步原理,并结合具体的需求进行设计和实现。这个过程不仅锻炼了编程能力,也对并发编程的理解有着重要的实践意义。在实际项目中,这样的并发控制技术广泛应用在...

    线程同步--生产者消费者问题

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    线程同步生产者消费者问题解析

    总的来说,"线程同步生产者消费者问题"是理解和掌握多线程编程的关键案例。通过这个案例,我们可以深入理解线程间的通信和协作,以及如何有效地使用线程同步机制来管理共享资源。对于开发者来说,掌握这些概念和技巧...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    在C++编程中,多线程通信是一种关键的...生产者-消费者模式是一种常用的线程同步策略,能够有效地解决数据生产和消费的问题。在实际编程中,理解并熟练掌握这些概念和技术,对于提升C++多线程程序的设计能力至关重要。

    线程实现生产者消费者问题

    生产者消费者问题是多线程编程中的一个经典模型,用于演示如何在并发环境中通过共享资源进行协作。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。问题的关键在于如何保证生产者不会在无处...

    Java 同步方式 wait和notify/notifyall

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

    随意写的 消费者-生产者 示例

    在Java或者其他支持多线程的编程语言中,实现消费者-生产者模型通常会用到线程安全的数据结构(如阻塞队列)和同步原语(如wait、notify和notifyAll)。在这个示例中,可能包含一个队列用于存储生产者生成的数据,...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    Java多线程-生产者与消费者问题

    生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者(Producer),负责生产数据或物品;另一个是消费者(Consumer),负责消耗这些数据或物品。在这...

    java编程的生产者消费者同步锁线程测试

    生产者消费者问题是多线程编程中的经典案例,用于演示如何通过同步机制来协调不同线程间的协作。这个问题的核心在于一个共享资源池,生产者线程负责填充资源,而消费者线程负责消耗这些资源,两者之间需要协调以避免...

    经典线程同步问题(生产者&消费者)--Java实现.doc

    生产者与消费者问题是经典的线程同步问题之一,它模拟了两个不同角色(生产者和消费者)对共享资源的访问。在这个问题中,生产者负责生成数据并放入一个有限的缓冲区,而消费者则从这个缓冲区取出数据进行消费。为了...

    基于JAVA线程机制研究生产者-消费者问题.pdf

    总之,基于Java线程机制研究生产者-消费者问题,通过实际编码演示了线程创建和管理、线程同步机制的应用,以及如何使用Java提供的数据结构来解决实际问题。这项研究不仅具有理论意义,更具有指导学生实践的意义,...

    java多线程实现生产者消费者关系

    在实际开发中,除了使用synchronized和wait/notify外,还可以利用Java并发库提供的高级工具,如`ExecutorService`,`CountDownLatch`,`CyclicBarrier`等,来更优雅地实现生产者消费者模型。例如,可以使用`...

    用多线程同步方法解决生产者-消费者问题操作系统课设.doc

    【标题与描述】所涉及的知识点是“生产者-消费者问题”,这是一个经典的多线程同步问题,常见于操作系统课程设计中。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。多线程同步是解决这类...

    多线程实现生产者消费者

    8. **死锁和饥饿**:在实现多线程生产者消费者模型时,必须警惕可能出现的死锁和饥饿问题。死锁是两个或更多线程相互等待对方释放资源导致的僵局,而饥饿则是指某一线程因为资源分配不公平而无法获得执行的机会。...

    基于JAVA线程机制研究生产者-消费者问题.zip

    生产者-消费者问题是多线程编程中的一个经典模型,用于演示线程间的协作和同步。这个模型描述了两个角色——生产者和消费者,它们共享一个有限的缓冲区。生产者负责创建产品并放入缓冲区,而消费者则从缓冲区取出...

    多线程_生产者与消费者模式示例

    5. **wait/notify机制**:生产者和消费者线程通过`wait()`和`notify()`方法进行通信。当队列满时,生产者调用`wait()`进入等待状态;队列有空位时,消费者完成消费后调用`notify()`唤醒等待的生产者。同样,队列为空...

Global site tag (gtag.js) - Google Analytics