生产者和消费者问题的产生
生产者和消费者是指俩个不同的线程对象,操作统一资源的情况:生产者负责生产数据,消费者负责消费数据,生产者每生产完一组数据后,消费者 消费一组数据,
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]); } } }