程序中加锁语句块,是为了保证生产时不能消费,消费时不能生产
程序中唤醒(notifyAll)语句是保证生产/消费完,唤醒消费/生产线程
-----------------------代码如下----------------------------
//生产类
import java.util.List;
public class Produce extends Thread {
private int max;
private List<Integer>list;
public Produce(String name,int max,List<Integer>list) {
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 List<Integer>list;
public Consumer(String name,int max,List<Integer>list) {
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) {
List<Integer>list=new ArrayList<Integer>();//共用的仓库
int max=100;//仓库最大容量
Produce p=new Produce("生产者", max, list);
Consumer c=new Consumer("消费者", max, list);
p.start();
c.start();
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章