Java多线程-经典例题-生产者消费者问题
/** * 经典例题 * 生产者、消费者问题 * 生产者将产品交给店员,而消费者从店员处取走产品,店员一次只能持有固定量产品(如20),如果生产者试图生产更多产品,店员会叫停生产者。 * 如果店中没有产品了,店员会叫消费者等一下,如果店中有产品了再通知消费者来取走产品。 * * * 分析 * 1.是否是多线程问题?是,消费者线程,生产者线程 * 2.是否有共享数据?是,店员(产品数量) * 3.线程安全问题?同步机制,三种方法 * 4.线程通信问题 * * @author orz */ public class ProductorCustomerTest { public static void main(String[] args) { Clerk clerk=new Clerk(); Producer producer=new Producer(clerk); producer.setName("生产者"); Consumer consumer=new Consumer(clerk); consumer.setName("消费者"); producer.start(); consumer.start(); } } class Clerk { private int productCount=0; //生产产品 public synchronized void produceProduct() { if(productCount<20) { try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } productCount++; System.out.println(Thread.currentThread().getName()+":开始生产第"+productCount+"个产品"); notify(); } else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } //消费产品 public synchronized void consumerConsumer() { if(productCount>0) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":开始消费第"+productCount+"个产品"); productCount--; notify(); } else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Producer extends Thread { private Clerk clerk; public Producer(Clerk clerk) { this.clerk=clerk; } @Override public void run() { System.out.println(Thread.currentThread().getName()+":开始生产产品..."); while (true) { clerk.produceProduct(); } } } class Consumer extends Thread{ private Clerk clerk; public Consumer(Clerk clerk) { this.clerk=clerk; } @Override public void run() { System.out.println(Thread.currentThread().getName()+":开始消费产品..."); while (true) { clerk.consumerConsumer(); } } }