当前位置: 移动技术网 > IT编程>开发语言>Java > java关于糖果生产与消费的简单游戏

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

2020年07月15日  | 移动技术网IT编程  | 我要评论

使用糖果的生产与消费小游戏来考察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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网