多线程编码实现生产者消费者问题

package test;

/**
 * 生产者消费者问题实现,消费时不生产,生产时不消费
 * on date:2019/10/24
 * 找工作期间没事干
 */
public class productAndCustomer {
    public static void main(String[] args) {
        Clerk clerk=new Clerk();
        //生产线程
        Product product=new Product(clerk);
        product.start();
        //消费线程
        Customer customer=new Customer(clerk);
        customer.start();
    }
}
/**
 * 店员类
 */
class Clerk{
    public  static  int productNum=0;
}

/**
 * 生产类
 */
class Product extends Thread {
    private  Clerk clerk;
    public  Product( Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        synchronized (clerk){
            while (true){
                if(clerk.productNum==0){
                    //没产品了,生产产品,消费线程等待
                    System.out.println("---产品 0 生产...... ---");
                    while (clerk.productNum<6){
                        System.out.println("生产库存:"+clerk.productNum);
                        clerk.productNum++;
                    }
                    System.out.println("生产结束:"+clerk.productNum);
                    //唤醒消费线程
                    System.out.println("--- 唤醒消费线程 ---");
                    clerk.notify();
                }else {
                    try {
                        //有,等待不生产,生产者线程等待
                        System.out.println("--- 生产者线程等待 ---");
                        clerk.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
/**
 * 客户类
 */
class Customer  extends Thread  {
    private  Clerk clerk;
    public  Customer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        synchronized (clerk){
        while (true){
            if(clerk.productNum==6){
                //有产品,可以进行消费
               while (clerk.productNum>0){
                    System.out.println("消费库存:"+clerk.productNum);
                    clerk.productNum--;
                }
                System.out.println("消费结束:"+clerk.productNum);
                //唤醒生产线程
                System.out.println("--- 唤醒生产线程 ---");
                clerk.notify();
            }else {
                try {
                    //没产品,消费线程等待
                    System.out.println("--- 消费线程等待 ---");
                    clerk.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        }
    }
}

注意 :多线程中如果实现了Runnable接口的类调用run方法 只会当做普通的对象方法执行,并不会创建一个新线程。也就是说程序只会按顺序执行,

Runnable 正确调用是:

Runnable1 r1 = new Runnable1();
new Thread(r1).start();
而非

r1.run() ;

 

posted @ 2019-10-24 16:17  Angry-rookie  阅读(103)  评论(0)    收藏  举报