欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java关于糖果生产与消费的简单游戏

程序员文章站 2022-03-06 10:35:33
使用糖果的生产与消费小游戏来考察java多线程,安全以及线程通信。工人生产糖果每次生产一个最多可以生产20个;小盆友每次可以吃一个,当糖果为零就需等待工人生产。本题是一个双线程问题,分别是工人和小盆友这两条,其次还要考虑两条线程的通信,当生产到20个时工人线停止并唤醒小盆友那条线;当小盆友吃完时这条线停止唤醒工人线。最后安全问题使用同步方法解决。代码如下:/*糖果类,属性是糖果,方法是生产和消费。生产和消费是两条线程,共用了糖果这个属性,使用同步方法(同步监视器是糖果类)保证安全性使用wait...

使用糖果的生产与消费小游戏来考察java多线程,安全以及线程通信。
工人生产糖果每次生产一个最多可以生产20个;小盆友每次可以吃一个,当糖果为零就需等待工人生产。
本题是一个双线程问题,分别是工人和小盆友这两条,其次还要考虑两条线程的通信,当生产到20个时工人线停止并唤醒小盆友那条线;当小盆友吃完时这条线停止唤醒工人线。最后安全问题使用同步方法解决。
代码如下:

/*
糖果类,属性是糖果,方法是生产和消费。生产和消费是两条线程,
共用了糖果这个属性,使用同步方法(同步监视器是糖果类)保证安全性
使用wait()和notify()保证信息传递。
 */




public class Candy {
    private int candy=0;

//     生产方法
    public synchronized void productCandy() {

        if (candy<20){
            candy++;
            System.out.println(Thread.currentThread().getName()+"正在生产第"+candy+"个糖果");
            notify(); //生产了之后就可以唤醒消费方法

        }else {
            try {
                wait();   //达到20个使其睡眠
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //消费方法
    public synchronized void consumeCandy() {


        if (candy>0){

            System.out.println(Thread.currentThread().getName()+"正在吃第"+candy+"个糖果");
            candy--;
            notify();  //消费一个就可以唤醒生产方法
        }else{
            try {
                wait(); //消费光了就使其睡眠
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

//生产类,无限生产即可
public class Producer extends Thread{
    private Candy candys;

    public Producer(Candy candys) {
        this.candys = candys;
    }

    @Override
    public  void run() {
        System.out.println("开始生产糖果");
        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            candys.productCandy();

        }


    }
}

//消费类,无限消费即可
public class Customers extends Thread{
    private Candy candys;

    public Customers(Candy candys) {
        this.candys = candys;
    }

    @Override
    public void run() {
        System.out.println("开始吃糖果");

        while (true){
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            candys.consumeCandy();

        }
    }
}
//控制台
public class Console {

    public static void main(String[] args) {
        Candy candys = new Candy();

        //生产和消费都要针对同一个糖果对象
        Producer producer = new Producer(candys);
        Customers customer = new Customers(candys);

        producer.setName("工人");
        customer.setName("小盆友");

        producer.start();
        customer.start();
    }
}

本文地址:https://blog.csdn.net/qq_44878531/article/details/107346818