多线程——生产者和消费者的问题

生产者和消费者问题的产生

   生产者和消费者是指俩个不同的线程对象,操作统一资源的情况:生产者负责生产数据,消费者负责消费数据,生产者每生产完一组数据后,消费者  消费一组数据,

 

  Object对多线程的支持:

   wait();等待被唤醒  notify();唤醒  notifyAll();唤醒所有

 

sleep()和wait()的区别:

   sleep()属于Thread类,类似于一个闹钟,只持续一定时间。wait()属于Object类,需要被notify()唤醒,如果不唤醒就会一直等待下去

 

具体案例如下:

/**
 * 
 */
package com.mindrader.thread;

/**
 * @作者 Mind reader
 * @内容 多线程——生产者和消费者基本案例
 * @项目名 Thread_Demo
 * @日期 2016年5月11日
 * @时间 上午10:49:09
 * 
 */
public class ThreadDemo2 {
    public static void main(String[] args) {
        Data data=new Data();
        new Thread(new Pro(data)).start();
        new Thread(new Cus(data)).start();
    }
}
class Data{//数据
    String name;
    String content;
    boolean exsit=false;//不存在商品
    public synchronized void set(String name,String content) {
        if(exsit==true){
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        this.name=name;
        this.content = content;
        super.notify();
        exsit=true;//存在
    }
    
    public synchronized String[] get() {
        if(exsit==false){//不存在就等待
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        String[] arr={this.name,this.content};
        
        super.notify();
        exsit=false;
        return arr;
    }
}

class Pro implements Runnable{//生产者
    Data data;
    public Pro(Data data){
        this.data=data;
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (i%2==0) {
                this.data.set("电脑厂商", "制造电脑");
            }else{
                this.data.set("手机厂商", "制造手机");
            }
        }
        
    }
}
class Cus implements Runnable{//消费者
    Data data;
    public Cus(Data data){
        this.data=data;
    }
    
    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String arr[];
        for(int i=0;i<100;i++){
            arr=data.get();
            System.out.println(arr[0]+"---------"+arr[1]);
            
        }
        
    }
}

 

posted @ 2016-05-11 12:13  奈水犹寒  阅读(323)  评论(0编辑  收藏  举报