jdk1.5多线程Lock接口及Condition接口

jdk1.5多线程的实现的方式:
jdk1.5之前对锁的操作是隐式
synchronized(对象) //获取锁
{

} //释放锁

jdk1.5锁的操作是显示的:在包java.util.concurrent.locks中含有多线程实现方式相关的接口和类。
有一个描述锁的Lock接口,也就是把锁面向对象了

使用Lock接口的子类ReentrantLock创建一把锁
Lock lock = new ReentrantLock();
使用Lock替代同步代码块的方式:
1:创建一把锁
2:把之前写在同步代码块中的代码写在lock()和unlock()之间

用lock替代同步代码块之后出现了IllegalMonitorStateException(无效的监视器状态异常)
因为wait(),notifyAll()必须用在同步中,而同步被Lock替代了,所以出现异常

jdk1.5对唤醒等待方法也进行了单独的描述,描述的接口是Condition。
唤醒等待方法必须结合锁来使用,所以使用LocknewCondition()方法来获取和锁绑定的Condition对象。

下面使用jdk1.5多线程的实现方式,解决一次唤醒所有线程性能低的问题。

  1 import java.util.concurrent.locks.*;
  2 class Product
  3 {
  4     private String name;
  5     private int count;
  6     private boolean flag;
  7 
  8     //创建一把锁
  9     private Lock lock = new ReentrantLock();
 10 
 11     //得到和锁绑定的Condition对象,控制生产线程的唤醒和等待
 12     private Condition pro = lock.newCondition();
 13     //得到和锁绑定的Condition对象,控制消费线程的唤醒和等待
 14     private Condition con = lock.newCondition();
 15     
 16     //生产产品的功能
 17     public void produce(String name)
 18     {
 19         lock.lock(); //获取锁
 20         try
 21         {
 22             while (flag) 
 23             {
 24                 try{pro.await();}catch (InterruptedException e){e.printStackTrace();}
 25             }
 26             this.name = name+"..."+count;
 27             System.out.println(Thread.currentThread().getName()+"***生产了***"+this.name);
 28             count++;
 29             flag = true;
 30             con.signal();
 31         }
 32         finally   //为了保证锁必须被释放掉,使用try{...}finally{...}
 33         {
 34             lock.unlock(); //释放锁
 35         }
 36     }
 37 
 38     //消费产品的功能
 39     public void consume()
 40     {
 41         lock.lock();
 42         try
 43         {
 44             while (!flag)
 45             {
 46                 try{con.await();}catch (InterruptedException e){e.printStackTrace();}
 47             }
 48             System.out.println(Thread.currentThread().getName()+"---消费了---"+this.name);
 49             flag = false;
 50             pro.signal();
 51         }
 52         finally
 53         {
 54             lock.unlock();
 55         }
 56     }
 57 }
 58 
 59 //生产任务
 60 class Producer implements Runnable
 61 {
 62     private Product pro;
 63     public Producer(Product pro)
 64     {
 65         this.pro = pro;
 66     }
 67     public void run()
 68     {
 69         while(true)
 70         {
 71             pro.produce("笔记本电脑");
 72         }
 73     }
 74 }
 75 
 76 //消费任务
 77 class Consumer implements Runnable
 78 {
 79     private Product pro;
 80     public Consumer(Product pro)
 81     {
 82         this.pro = pro;
 83     }
 84     public void run()
 85     {
 86         while(true)
 87         {
 88             pro.consume();
 89         }
 90     }
 91 }
 92 
 93 class Demo
 94 {
 95     public static void main(String[] args) 
 96     {
 97         Product pro = new Product();
 98         
 99         Producer producer = new Producer(pro);
100         Consumer consumer = new Consumer(pro);
101 
102         new Thread(producer,"生产线01").start();
103         new Thread(consumer,"消费者01").start();
104         new Thread(producer,"生产线02").start();
105         new Thread(consumer,"消费者02").start();
106     }
107 }

 

posted @ 2016-12-06 16:53  ninan_ton  阅读(607)  评论(0)    收藏  举报