ITPub博客

首页 > IT职业 > IT生活 > 线程类----生产消费者模型

线程类----生产消费者模型

IT生活 作者:supersea 时间:2021-09-09 09:05:40 0 删除 编辑

程序中加锁语句块,是为了保证生产时不能消费,消费时不能生产
程序中唤醒(notifyAll)语句是保证生产/消费完,唤醒消费/生产线程
-----------------------代码如下----------------------------
//生产类
import java.util.List;

public class Produce extends Thread {
private int max;
private Listlist;
public Produce(String name,int max,Listlist) {
super(name);//这里如果使用接口创建线程,super就不可以调用name
this.max=max;
this.list=list;
}
public void run(){
while(true){
synchronized (list) {
while(list.size()==max){
System.out.println("仓库已满!");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
int num=(int) (Math.random()*100+1);
list.add(num);
System.out.println(this.getName()+"生产了产品:"+num);
list.notifyAll();
}
}
}
}
//客户类
import java.util.List;

public class Consumer extends Thread{
private int max;
private Listlist;
public Consumer(String name,int max,Listlist) {
super(name);
this.max=max;
this.list=list;
}
@Override
public void run() {
while(true){
synchronized (list) {
while(list.isEmpty()){
System.out.println("仓库已空!");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(this.getName()+"消费了产品:"+list.get(list.size()-1));//每次消费最后一个
list.remove(list.size()-1);//移除最后一个
list.notifyAll();
}
}
}
}
//测试类
import java.util.ArrayList;
import java.util.List;

public class Test{
public static void main(String[] args) {
Listlist=new ArrayList();//共用的仓库
int max=100;//仓库最大容量
Produce p=new Produce("生产者", max, list);
Consumer c=new Consumer("消费者", max, list);
p.start();
c.start();
}

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2650/viewspace-2808011/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    90
  • 访问量
    799