1,、生产者消费者问题
怎么保资源的同步,怎样保证数据的重复读写问题
synchronized解决同步问题,等待唤醒机制解决数据重复问题。
wait和sleep的区别
主要wait父类为object,sleep父类为thread
wait需要另一个线程唤醒,sleep是到达指定时间后主动释放线程
一下例子仅供参考,有不足之处多多指教
package sxd.providercustomer; public class Data { private String title; private String note; //等于true表示允许生产但是不允许消费反之亦然 private boolean flag = false; public synchronized void get(){ if(flag == false){//已经生产 try { super.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { Thread.sleep(50); } catch (Exception e) { // TODO: handle exception } System.out.println(this.title + " = "+ this.note); this.flag = false; super.notify(); } public synchronized void set(String title, String note){ if(flag == true){//不允许消费者取走 try { super.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.title = title; this.note = note; try { Thread.sleep(100); } catch (Exception e) { // TODO: handle exception } this.flag = true; super.notify(); } /*public String getNote() { return note; } public void setNote(String note) { this.note = note; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } */ } package sxd.providercustomer; public class DataP implements Runnable { private Data data; public DataP(Data data){ this.data = data; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<50;i++){ if(i % 2 == 0){ this.data.set("李四","好人"); }else{ this.data.set("张三","大好人"); } } } } package sxd.providercustomer; public class DataC implements Runnable{ private Data data; public DataC(Data data){ this.data = data; } @Override public void run() { // TODO Auto-generated method stub for(int i =0; i<50;i++){ this.data.get(); } } } package sxd.providercustomer; public class TestDemo { public static void main(String[] args) { Data data = new Data(); new Thread(new DataP(data)).start(); new Thread(new DataC(data)).start(); } }