(多线程的开发中最经典的操作案例,生产者不断生产产品,消费者不断取走产品)
public class Demo { /* * 生产者、消费者问题 * * 生产者将产品交给店员,而消费者从店员取走产品,店员一次只能持有固定数量的产品, * 如果生产者生产了过多的产品,店员会叫生产者等一下,如果店中有空位放产品了在通知生产者继续生产; * 如果店中没有了产品,店员会告诉消费者等一下,如果店中有产品了再通知消费者取走产品。 * */ }
//店员 public class Clerk { private int product=0;//产品默认为0 //生产者生成出来的产品交给店员 public synchronized void addProduct(){ if(this.product>=20){ try { wait();//产品已满,请稍等在生产 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ product++; System.out.println("生产者生产地"+product+"个产品。"); notifyAll();//通知等待区的消费者今天取产品了 } } //消费者从店员处取产品 public synchronized void getProduct(){ if(this.product<=0){ try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ System.out.println("消费者取走了第"+product+"个产品"); product--; notifyAll();//通知等待区的生产者可以生产产品 } } }
//生产者线程要执行的任务 public class Producer implements Runnable { private Clerk cl; public Producer(Clerk cl) { this.cl = cl; } @Override public void run() { // TODO Auto-generated method stub System.out.println("生产者开始生产产品!"); while(true){ try { Thread.sleep((int)(Math.random()*10)*100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } cl.addProduct(); } } }
//消费者线程要执行的任务 public class Consumer implements Runnable { private Clerk cl; public Consumer(Clerk cl) { super(); this.cl = cl; } @Override public void run() { // TODO Auto-generated method stub System.out.println("消费者开始取走产品!"); while(true){ try { Thread.sleep((int)(Math.random()*10)*100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } cl.getProduct();//取走产品 } } }
//主线程 public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Clerk cl=new Clerk(); Thread prt=new Thread(new Producer(cl));//生产者线程 Thread cot=new Thread(new Consumer(cl));//消费者线程 prt.start(); cot.start(); } }
时间: 2024-11-08 05:21:52