要求:生产者线程,消费者线程。初始产品数量为1,start两个线程后只有生产者生产后消费者才能消费,且生产者必须等待消费者消费完成后才能继续生产。
实现:
1):类设计
(1)产品类:有产品数量属性,信号量属性(两个线程通信,即根据此标示来让生产者线程和消费者线程休眠或者工作),以及两个synchronized方法(用于控制在任何时间只有一个线程操作创建的产品类实例)。
public class productor {
private int num;
public boolean flag=true;
public productor() {
num=1;
}
public int return_val() {
return num;
}
public synchronized void add() {
if(!flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
num++;
flag=false;
notifyAll();
System.out.println("生产+1,当前数目:"+return_val());
}
}
public synchronized void delete() {
if(flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
num--;
flag=true;
notifyAll();
System.out.println("消费减一,当前数目:"+return_val());
}
}
}
(2)生产者线程类:继承runable借口,实例化时需要传入目标产品类实例。
import java.lang.System;
public class produceor implements Runnable {
productor productor;
public produceor(productor p){
this.productor=p;
}
@Override
public void run() {
while (true) {
productor.add();
}
}
}
(3)消费者线程类:继承runable接口,实例化时需要传入目标产品类实例
public class consumer implements Runnable {
private productor productor;
public consumer(productor p) {
// TODO Auto-generated constructor stub
this.productor=p;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
productor.delete();
}
}
}
2)测试及结果
测试方法:
public class test_consumer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
productor p=new productor();
produceor p1=new produceor(p);
consumer c1=new consumer(p);
Thread t1=new Thread(p1);
Thread t2=new Thread(c1);
t2.start();
t1.start();
}
}