java线程---生产者与消费者,同步问题
package com.thread.sync; class common {//同步资源池 private char ch; //****资源池公用资源*** private boolean available=false;//默认等待生产数据 synchronized char get(){//定义同步资源方法,消费者使用 while (available==false)//当资源没有生产的时候,一直等待,当available==false时,条件为**"真"**,执行while,里面wait实现 等待 try { wait(); //等待 } catch (Exception e){} available=false; return ch; } synchronized void put(char newch){//生产者将要使用其生产数据 while(available==true)//当available==true时,条件依然为**真**,内部也是等待生产者将数据放入,也就是说while无论是在get方法还是这里,都是作为线程等待 数据判断的依据,也就可以理解在synchronized声明的方法中,其实是同步进行的。 //即等待和后续其实都是在进行的,而他等待的是”多线程“来放入数据或者拿取数据 try { wait(); } catch (InterruptedException e) {} ch=newch; available=true;//标记,”告诉别人可以取值 了,或者消费了,我有产品了“ notify();//唤醒消费者线程 } } //生产者 class producer extends Thread{ private common comm; //同步资源类 public producer(common thiscomm){ comm = thiscomm;//指向同步资源类 } @Override public void run() { char c; for (c='a';c<='e';c++) { System.out.println("生产者生产了数据"+c); comm.put(c); } } } class consumer extends Thread{ private common comm;//同步资源类 public consumer(common thiscomm){ comm = thiscomm;//指向同步资源类 } @Override public void run() { char c; for (int i = 0; i < 5; i++) { c = comm.get(); System.out.println("消费者得到的数据"+c); } } } //消费者,从生产者和消费者类来看,他们都共同使用同步资源类,同时构造方法指向同步资源,并且他们共同操作同步资源数据 //消费者和生产者都继承了Thread类,并覆盖了run方法,一个用来生产数据,一个消费数据 //生产者与消费者,"同步资源池";生产者生产数据,放入资源池;消费者消费数据,使用资源池;主程序new并实现 public class ThreadSync { public static void main(String[] args) { common comm = new common(); producer p = new producer(comm); consumer c = new consumer(comm);//一个生产,多个消费 consumer c1 = new consumer(comm); p.start();c.start();c1.start(); } }