用jdk1.5新增API解决生产者消费者问题[转帖]_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3713 | 回复: 0   主题: 用jdk1.5新增API解决生产者消费者问题[转帖]        下一篇 
ying
注册用户
等级:上尉
经验:694
发帖:59
精华:0
注册:2012-10-12
状态:离线
发送短消息息给ying 加好友    发送短消息息给ying 发消息
发表于: IP:您无权察看 2012-11-2 15:38:42 | [全部帖] [楼主帖] 楼主

package cn.itcast.gz;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
jdk1.5以后将同步和锁封装成了对象。
并将操作锁的隐式方式定义到了该对象中,
将隐式动作变成了显示动作。

Lock接口: 出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成现实锁操作。
同时更为灵活。可以一个锁上加上多组监视器。
lock():获取锁。
unlock():释放锁,通常需要定义finally代码块中。

Condition接口:出现替代了Object中的wait notify notifyAll方法。
   将这些监视器方法单独进行了封装,变成Condition监视器对象。
   可以任意锁进行组合。
await();     让线程等待,同时释放锁
signal();    唤醒同一把锁中的任意一个等待的线程
signalAll(); 唤醒同一把锁中的所有等待的线程

*/
public class ProducerConsumerDemo {
      public static void main(String[] args) {
            Resource4 r = new Resource4();
            Producer producer = new Producer(r);
            Consumer consumer = new Consumer(r);
            Thread t1 = new Thread(producer);
            Thread t2 = new Thread(producer);
            Thread t3 = new Thread(consumer);
            Thread t4 = new Thread(consumer);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
      }
}
class Resource4
{
Lock lock = new ReentrantLock();
Condition pro = lock.newCondition();
Condition con = lock.newCondition();
private boolean flag= false;
private int num= 0;
public void product()
{
      lock.lock();
      try{
            while(flag)
try{pro.await();}catch(Exception e){e.printStackTrace();};
      num++;
      System.out.println("生产烤鸭"+num);
      flag = true;
      con.signal();
}
finally
{
lock.unlock();
}
}
public void consumer()
{
      lock.lock();
      try
      {
            while(!flag)
try{con.await();}catch(Exception e){e.printStackTrace();};
      System.out.println("消费烤鸭                    "+num);
      flag = false;
      pro.signal();
}
finally
{
lock.unlock();
}
}
}
class Producer implements Runnable
{
      private Resource4 r ;
      public Producer(Resource4 r)
      {
            this.r = r;
      }
      @Override
      public void run() {
            while(true)
            r.product();
      }
}
class Consumer implements Runnable
{
      private Resource4 r;
      public Consumer(Resource4 r)
      {
            this.r = r;
      }
      @Override
      public void run() {
            while(true)
            r.consumer();
      }
}




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论