第一次写生产者消费者问题

来源:互联网 发布:发型p图软件 编辑:程序博客网 时间:2024/06/06 01:21
/*
 * 生产者和消费者问题
 */
package lyj.java;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


//描述资源
class Resource{
//成员
private String name;
private int num;
//定义标记
private boolean flag=false;
//引入lock,创建lock对象
private Lock lock=new ReentrantLock();
//引入condition 
private Condition pro=lock.newCondition();
private Condition con=lock.newCondition();

//方法1:生产
public   void set(String name){
//获取锁
lock.lock();
try{
//循环
while(true)
{
//判断标记
while(flag)
try{pro.await();}catch(InterruptedException e){}
this.name=name+num;
num++;
System.out.println(Thread.currentThread().getName()+"----生产---"+this.name);
//更改标记
flag=true;
//唤醒消费者
con.signal();
}


}
//释放锁
finally{
lock.unlock();
}
}
//方法2:消费
public  void out(){
//获取锁
lock.lock();
try{
//循环
while(true)
{
//判断标记
while(!flag)
try{con.await();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"--消费---"+this.name);
//更改标记
flag=false;
//唤醒生产者
pro.signal();

}
}
//释放锁
finally{
lock.unlock();
}
}

}


//描述生产者
class Producer implements Runnable{

private Resource r;
//利用构造函数对资源对象进行初始化
Producer(Resource r){
this.r=r;
}

//重写run方法
@Override
public void run() {
r.set("馒头");

}

}
//描述消费者
class Consumer implements Runnable{
private Resource r;
//利用构造方法对资源对象初始化
Consumer(Resource r){
this.r=r;
}
//重写run方法
@Override
public void run() {
r.out();

}

}
public class Test1 {


public static void main(String[] args) {
Resource r=new Resource();
//生产者线程
Producer pro=new Producer(r);
//消费者线程
Consumer con=new Consumer(r);

Thread t1=new Thread(pro);
Thread t2=new Thread(con);

t1.start();
t2.start();


}


}
0 0
原创粉丝点击