ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-01 11:31:34  阅读:147  来源: 互联网

标签:Thread Clerk 代码 productCount public void 一段 解决 clerk


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,输出结果如下)
在这里插入图片描述
在这里插入图片描述
发现,消费者消费到最后一个产品之后和第一短代码一样,不再输出了

标签:Thread,Clerk,代码,productCount,public,void,一段,解决,clerk
来源: https://blog.csdn.net/qq_41571545/article/details/123201727

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有