/*
- 描述生产者和消费者问题
- 1.基本的描述
- 2.上一步只能执行一次,加入while循环,
- 3.加入循环后,发现线程不能同步,故加入同步,经过比较,使用同步函数
- 4.使用同步函数之后,还是没有解决问题,出现只生产不消费的问题
- 5.加入信号量机制flag,使用wait(),和notify()。在使用wait时,需要使用异常声明
- 6.还是没法解决问题,查API后引入lock接口 ,使用lock代替同步
- 7.引入condition */
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;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
//空的构造方法
public Resource(){}
//构造方法
public Resource(String name, int num) {
super();
this.name = name;
this.num = num;
}
//引入lock,并创建对象
Lock lock=new ReentrantLock();
//引入condition
Condition con=lock.newCondition();
Condition pro=lock.newCondition();
//功能1:生产
public synchronized void set(){
while(true)
{ lock.lock();
if(flag)
try{con.await();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"---生产---"+num);
num++;
pro.signal();
lock.unlock();
}
}
//功能2:消费
public synchronized void out(){
while(true)
{ lock.lock();
if(!flag)
try{pro.await();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"-----消费------"+num);
con.signal();
lock.unlock();
}
}
}
/*
-
描述生产者
*/
class Producer implements Runnable{
private Resource r;
//构造方法
public Producer(Resource r) {
this.r=r;
}
//复写run方法
public void run() {
r.set();}
}
/*
-
描述消费者
*/
class Consumer implements Runnable{
private Resource r;
//构造方法
public Consumer(Resource r) {
this.r=r;
}
//复写run方法
public void run() {
r.out();}
}
public class Test8 {
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();
}
}