生产者消费者问题

来源:互联网 发布:hadoop java获取文件 编辑:程序博客网 时间:2024/06/04 20:05

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 blocke.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 blocke.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;   }@Overridepublic void run() {// TODO Auto-generated method stubfor(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;}@Overridepublic void run() {// TODO Auto-generated method stubfor(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(); }}

原创粉丝点击