多线程间通信——生产者消费者问题
生产和消费同时进行,需要多线程。但是执行的任务不相同,处理的资源却是相同的:线程间的通信。
1、存在的问题及解决
期望生产一个商品就被消费掉,再生产下一个商品。
1 /** 2 * 案例:期望生产一个商品就被消费掉,再生产下一个商品。 3 */ 4 //1、描述资源 5 class Resource{ 6 private String name; 7 private int count=1; 8 public Object lock=new Object(); 9 public void set(String name) throws InterruptedException { 10 //给成员变量赋值并加上编号 11 this.name = name+count; 12 //编号自增 13 count++; 14 //打印生产了哪个商品 15 Thread.sleep(500); 16 System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name); 17 } 18 19 public void out() { 20 System.out.println(Thread.currentThread().getName()+"...消费者.."+this.name); 21 } 22 } 23 24 //2、描述生产者 25 class Producer implements Runnable{ 26 private Resource r; 27 public Producer(Resource r){ 28 this.r=r; 29 } 30 @Override 31 public void run() { 32 while(true) { 33 try { 34 r.set("面包"); 35 } catch (InterruptedException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 } 40 } 41 } 42 //3、描述消费者 43 class Consumer implements Runnable{ 44 private Resource r; 45 public Consumer(Resource r){ 46 this.r=r; 47 } 48 @Override 49 public void run() { 50 while(true) { 51 r.out(); 52 } 53 } 54 } 55 56 public class ThreadMain { 57 public static void main(String[] args) { 58 //1、创建资源对象 59 Resource r=new Resource(); 60 //2、创建线程任务 61 Producer p=new Producer(r); 62 Consumer c=new Consumer(r); 63 //3、创建线程对象 64 Thread t1=new Thread(p); 65 Thread t2=new Thread(c); 66 67 t1.start(); 68 t2.start(); 69 } 70 }