java多线程(生产者/消费者)
要求:
完成一个java application应用程序,来仿真2个生产者和3个消费者共同操作一个数据队列(例如一个vector类对象),数据队列中有时是没有数据的,这个时候消费者应该处于等待状态而不是不断的去访问这个数据队列。消费者线程一次消费后发现数据队列空了,就应该处于等待状态,生产者生产数据(向数据队列加入一条数据)后,就去唤醒消费者线程开始消费。生产者线程某次生产后发现数据队列已经满了(例如此vector类对象中已经存在10条数据),也应该处于等待状态,消费者消费一条数据后,就去唤醒生产者继续生产。
方法说明:
当没有商品时消费者线程不能进行消费或者当商品满的时候生产者不能再进行生产,这就需要使得线程等待,可使用如下方法:
if(isEmpty()){
Vector.vector.wait();//等待
}
当生产者生产出来商品需要唤醒消费者消费,可进行如下控制
Vector.vector.notify();//唤醒消费方法
还用到了同步的方法,具体语法如下:
synchronized(Vector.vector){}
程序源代码如下:
public class Thread01 {
public static void main (String[]arges){
ThreadA a1=new ThreadA();//创建消费者线程1
ThreadA a2=new ThreadA();//创建消费者线程2
ThreadA a3=new ThreadA();//创建消费者线程3
ThreadB b2=new ThreadB();//创建生产者线程1
ThreadB b3=new ThreadB();//创建生产者线程2
a1.start();//开启消费者线程1
a2.start();//开启消费者线程2
a3.start(); //开启消费者线程3
b2.start();//开启生产者线程1
b3.start(); //开启生产者线程2
}
public static class Vector{//创建一个Vector类
static Object vector=new Object();//创建一个Object类对象vector
static int gy=10;//创建成员变量,vector的总容量设定为10
static int yy=0;//当前生产设定为0
static int xf=0;//当前消费设定为0
}
public static boolean isEmpty(){//创建一个isEmpty方法判断vector是否有商品
return Vector.yy==Vector.xf?true:false;//如果生产等于消费则无商品返回true
}
public static class ThreadA extends Thread{
void Consumer(){//构建消费者方法
synchronized(Vector.vector){
System.out.println("vector中是否有商品:"+!isEmpty());
if(isEmpty()){
System.out.println("现在没有商品,消费者等待.....");
try{
Vector.vector.wait();//等待
}catch(InterruptedException e){
e.printStackTrace();
}
}else{
Vector.xf++;//消费自加1
System.out.println("消费者目前的总消费为:"+Vector.xf);
}
}
}
public void run(){
while(true){
if(isEmpty())
System.out.println("消费开始");
Consumer();//调用消费者方法
try{
Thread.sleep(2000);//线程休息2000ms
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
public static class ThreadB extends Thread{
void Producer (){//构建生产者方法
synchronized(Vector.vector){
if(Vector.yy-Vector.xf>=Vector.gy){
System.out.println("商品已满,生产等待......");
try{
Vector.vector.wait();//等待
}catch(InterruptedException e){
e.printStackTrace();
}
}else{
Vector.yy++;//生产自加1
Vector.vector.notify();//唤醒消费方法
System.out.println("生产者目前的总生产数为:"+Vector.yy);
}}
}
public void run(){
while(true){
System.out.println("生产工作开始");
Producer();//调用生产者方法
try{
Thread.sleep(1000);//线程休息1000ms
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
运行结果: