Java 多线程 经典练习题

12 阅读1分钟
//练习题
 //生产者(Producer) 将产品交给店员(Clerk) 而消费者(Customer)从店员处取走商品
 // 店员一次只能持有固定数量的产品(比如20) 如果生产者试图生产更多的产品
 // 店员会叫生产者停一停 如果店中有空位 再通知生产者 继续生产
 // 如果店中没有了产品 店员会告诉消费者等一下
 // 如果店中有了产品 再通知消费者取走产品
 // 分析1. 是否是多线程问题 ? 是 生产者线程 消费者线程
 // 2. 是否有共享数据? 是 店员(或产品)
 // 3. 如何解决线程安全问题?
 // 4. 是否涉及到线程通信? 是
 
 Clerk clerk = new Clerk();
 Producer producer = new Producer(clerk);
 Customer customer = new Customer(clerk);
 Thread thread2 = new Thread(producer);
 Thread thread3=new Thread(customer);
 Thread thread4=new Thread(producer);
 thread2.setName("生产者1");
 thread3.setName("消费者1");
 thread4.setName("生产者2");
 thread2.start();
 thread4.start();
 thread3.start();
package com.day7.test;
 
/**
 * User: Json
 * Date: 2021/8/20
 * 生产者
 **/
public class Producer implements  Runnable{
    private Clerk clerk;
    public Producer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.clerk.pro();
        }
 
    }
}
package com.day7.test;
 
/**
 * User: Json
 * Date: 2021/8/20
 * 店员
 **/
public class Clerk {
      private int num=0;
 
    //生产商品
    public synchronized void pro(){
 
            if(num<20){
                num++;
                System.out.println(Thread.currentThread().getName()+"生产的第"+num+"产品");
                notify();
            }else{
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
 
 
    }
 
    //消费商品
    public synchronized void Cus(){
 
            if(num>0){
                System.out.println(Thread.currentThread().getName()+"消费了第"+num+"个产品");
                num--;
                notify();
            }else{
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
 
    }
 
 
}
package com.day7.test;
 
/**
 * User: Json
 * Date: 2021/8/20
 * 消费者
 **/
public class Customer implements Runnable{
    private Clerk clerk;
    public Customer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.clerk.Cus();
        }
 
 
    }
 
 
}