黑马程序员技术交流社区
标题:
看完生产者消费者及JDK1.5新解决办法,写个代码耍耍
[打印本页]
作者:
王瀛
时间:
2013-5-31 01:19
标题:
看完生产者消费者及JDK1.5新解决办法,写个代码耍耍
rt,
三线程,分别是 生产者--->消费者--->吃货,三者同步。代码如下:
import java.util.concurrent.locks.*;
class Mooncake
{
private Mooncake(){}//单例模式
private static final Mooncake mooncake = new Mooncake();
public static Mooncake getInstance()
{
return mooncake;
}
private String shape;
private String taste;
private int flag = 0;//初始化资源状态为0(0表示生产者可以进行,1表示消费者可以进行,2表示吃货可以进行)
ReentrantLock lock = new ReentrantLock();//获取锁的实例对象
Condition condition_pro = lock.newCondition();//创建同一个锁对应的三种不同condition实例
Condition condition_con = lock.newCondition();
Condition condition_foo = lock.newCondition();
public void setMooncake(String shape,String taste)throws InterruptedException//声明await方法产生的异常
{
lock.lock();//加锁
try
{
while (flag!=0)//如果资源状态不是0,则等待
condition_pro.await();
this.shape = shape;
this.taste = taste;
System.out.println("生产了一个::"+shape+"形::"+taste+"口味的月饼::");
flag = (flag+1)%3;//切换资源状态
condition_con.signal();//生产结束后唤醒消费者
}
finally
{
lock.unlock();//释放锁资源
}
}
public void getMooncake()throws InterruptedException
{
lock.lock();//加锁
try
{
while(flag!=1)
condition_con.await();//如果资源状态不是1,则等待
System.out.println("消费了一个~~~~~~~"+shape+"形~~~~~~~"+taste+"口味的月饼~~~~~~~");
flag = (flag+1)%3;//切换资源状态
condition_foo.signal();//消费结束后唤醒吃货
}
finally
{
lock.unlock();//释放锁
}
}
public void eatMooncake()throws InterruptedException
{
lock.lock();//加锁
try
{
while(flag!=2)
condition_foo.await();//如果资源状态不是2,则等待
System.out.println("吃了一个............"+shape+"形............"+taste+"口味的月饼............");
System.out.println();
flag = (flag+1)%3;//切换资源状态
condition_pro.signal();//唤醒生产者
}
finally
{
lock.unlock();//释放锁资源
}
}
}
class Producer implements Runnable
{
public void run()
{
while (true)
{
try
{
Mooncake.getInstance().setMooncake("圆","水果");
}
catch (InterruptedException e)
{
}
}
}
}
class Consumer implements Runnable
{
public void run()
{
while (true)
{
try
{
Mooncake.getInstance().getMooncake();
}
catch (InterruptedException e)
{
}
}
}
}
class Foodie implements Runnable
{
public void run()
{
while (true)
{
try
{
Mooncake.getInstance().eatMooncake();
}
catch (InterruptedException e)
{
}
}
}
}
class ProducerMooncake0
{
public static void main(String[] args)
{
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new Foodie()).start();
}
}
复制代码
睡觉去了。。。困~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2