有问题的一段代码,待解决

package com.www.java2;

/**
 *
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
class Clerk{

    private int productCount = 0;
    public void produceProduct() {

            if(productCount < 20){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                productCount++;
                System.out.println(Thread.currentThread().getName() + "开始生产第" + productCount + "个产品");
            }


    }

    public void consumeProduct() {

            if(productCount > 0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "开始消费第" + productCount + "个产品");
                productCount--;
            }

    }
}

class Productor extends Thread{
    private Clerk clerk;
    public Productor(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println(getName() + "开始生产产品");
        while (true){
            clerk.produceProduct();
        }
    }
}

class Customer extends Thread{
    private Clerk clerk;
    public Customer(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {

        System.out.println(getName() + "开始消费产品");
        while (true){
            clerk.consumeProduct();
        }
    }
}

public class ProductTest {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
        Productor p1 = new Productor(clerk);
        Customer c1 = new Customer(clerk);
        p1.setName("生产者1");
        c1.setName("消费者1");
        p1.start();
        c1.start();
    }
}

输出结果:只有生产者,没有消费者
在这里插入图片描述
将执行方法挪到run里


package test;

/**
 *
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
class Clerk{

//    private int productCount = 2;
      int productCount = 2;
//    public void produceProduct() {
//
//            if(productCount < 20){
//                try {
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                productCount++;
//                System.out.println(Thread.currentThread().getName() + "开始生产第" + productCount + "个产品");
//            }
//
//
//    }

//    public void consumeProduct() {
//
//            if(productCount > 0){
//                try {
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(Thread.currentThread().getName() + "开始消费第" + productCount + "个产品");
//                productCount--;
//            }
//
//    }
}

class Productor extends Thread{
    private Clerk clerk;
    public Productor(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println(getName() + "开始生产产品");
        while (true){
        	 if(clerk.productCount < 20){
                 try {
                     Thread.sleep(10);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
                 clerk.productCount++;
                 System.out.println(Thread.currentThread().getName() + "开始生产第" + clerk.productCount + "个产品");
             }
//            clerk.produceProduct();
        }
    }
}

class Customer extends Thread{
    private Clerk clerk;
    public Customer(Clerk clerk){
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println(getName() + "开始消费产品");
        while (true){
        	if(clerk.productCount > 0){
        		try {
        			Thread.sleep(10);
        		} catch (InterruptedException e) {
        			e.printStackTrace();
        		}
        		System.out.println(Thread.currentThread().getName() + "开始消费第" + clerk.productCount + "个产品");
        		clerk.productCount--;
        	}
//            clerk.consumeProduct();
        }
    }
}

public class ProductTest {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
        Productor p1 = new Productor(clerk);
        Customer c1 = new Customer(clerk);
        p1.setName("生产者1");
        c1.setName("消费者1");
        p1.start();
        c1.start();
    }
}

输出结果:多次运行,都是只在23徘徊
在这里插入图片描述
首先不懂第一个为什么消费者进程不运行,第二第一个第二个区别在哪,为什么结果不一样,最后,执行权在第二个中一直交替得到,太有规律,不太正常(针对第三点解决:可能是睡眠时间太短,故将消费睡眠时间改为100,输出结果如下)
在这里插入图片描述
在这里插入图片描述
发现,消费者消费到最后一个产品之后和第一短代码一样,不再输出了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新手学java2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值