生产、消费模型:
一、生产、消费模型:
在线程间通讯的时候,当在一个对象上调用wait()方法时,当前线程就会进入wait状态,直到收到另一个对象的notify()发出通知,才会执行下一部计算,而且线程在wait的时候,也可能被中断,这就是"生产/消费模型"
二、简单实现:
1.生产和消费线程用来操作的对象:
package 生产_消费模型; /** * 用来交换的数据对象模型 * @author Administrator * */ public class Student { int id; String name; public String toString(){ return id+"<>"+name; } }
2.生产线程:
package 生产_消费模型; import java.util.List; public class ProduceThread extends Thread { //与消费线程或以共同存取的对象列表 private List shareList; //用来标记的放入对象的每一个独立的编号 private static int count; //构造器参数是生产线程要放入数据的队列 public ProduceThread(List shareList){ this.shareList = shareList; } @Override public void run() { // TODO Auto-generated method stub //super.run(); System.out.println("生产线程已经启动:"+shareList.size()); while(true){ try { Thread.sleep(2000); synchronized (shareList) { while(shareList.size()>0){ shareList.wait(); } while(shareList.size()==0){ Student st = new Student(); count++; st.id = count; st.name="对象"+count; System.out.println("生产线程放入对象:"+st.toString()); shareList.add(st); shareList.notify(); } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
通过构造函数把操作对象的List传进去,如果List里面有对象,就要wait,而当List里面没有对象,该生产线程就要产生一个,并发出notify的通知.并把操作的对象加入操作对象的List
3.消费线程:
package 生产_消费模型; import java.util.List; /** * 消费线程 * @author Administrator * */ public class CustomerThread extends Thread{ private List shareList; @Override public void run() { // TODO Auto-generated method stub //super.run(); System.out.println("消费线程已经启动:"+shareList.size()); while(true){ synchronized (shareList) { while (shareList.size()==0) { //如果没有,消费线程就要等待 try { shareList.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while(shareList.size()>0){ System.out.println("消费线程取出:"+shareList.remove(0).toString()); //取出一个后,就发通知 shareList.notify(); } } } } public CustomerThread(List shareList){ this.shareList = shareList; } }
通过构造函数把操作对象的List传进去,当List里面没有对象时,消费线程也就没什么可以消费的了,就要进入wait状态,当List里面有对象时,消费线程就消费一个,并发出notify的通知。
4.Main:
package 生产_消费模型; import java.util.LinkedList; import java.util.List; /** * 主函数 * @author Administrator * */ public class Cb123456 { public static void main(String[] args) { //生产,消费线程交换的队列 List shareList = new LinkedList(); //启动生产线程 new ProduceThread(shareList).start(); //启动消费线程 new CustomerThread(shareList).start(); } }
三、运行结果:
四、结果分析:
1.Main里面,通过new关键字给LinkedList分配内存空间,同时实例化,但此时的LinkedList里面什么都没有,所以是生产线程先执行的
2.在控制台可以看见在输出结果的时候,生产线程和消费线程总是同时显示结果的.
五、补充:
1.LinkedList:
2.null和" "
其中null是表示没有地址.而" "表示是一个字符串,有地址的,但是字符串里面的内容却是空的,null就像没有锅,而" "表示有锅却没有米的
六、总结:
生产消费模型:当集合中没有对象时,生产线程会产生一个,并发出通知,然后消费线程就把它给消费了。