生产、消费模型:
一、生产、消费模型:
在线程间通讯的时候,当在一个对象上调用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就像没有锅,而" "表示有锅却没有米的
六、总结:
生产消费模型:当集合中没有对象时,生产线程会产生一个,并发出通知,然后消费线程就把它给消费了。