英雄有泪

欲学惊人艺,须下苦功夫,深功出巧匠,苦练出真功。

导航

黑马程序员_Java基础:实现多线程对共有数据的同步操作

      实现多线程对共有数据的同步操作,主要涉及到多线程和同步。

      虽然都是基础,但是这把刀还是要用熟练,等到使用的时候才能得心应手。

 

以下是示例:

  1 /*
  2  * 需求:有生产者和消费者,生产者生产一个,消费者才能消费一个,但如果消费者不消费,也不能生产。
  3  * 知识点:同步,多线程,等待唤醒机制,单例设计模式。*/
  4 package com.gzjzone.jul242015;
  5 
  6 import java.util.concurrent.locks.Condition;
  7 import java.util.concurrent.locks.Lock;
  8 import java.util.concurrent.locks.ReentrantLock;
  9 
 10 class ProducerConsumerTest {
 11     public static void main(String[] args) {
 12         new Thread(new Producer()).start();
 13         new Thread(new Consumer()).start();
 14         new Thread(new Producer()).start();    //多生产者。
 15         new Thread(new Consumer()).start();    //多消费者。
 16     }
 17 
 18 }
 19 
 20 class Product{
 21 //    单例设计模式:饿汉式。
 22     private Product(){};
 23     private static Product product = new Product();
 24     public static Product getProduct(){
 25         return product;
 26     }
 27     private int pro = 0;
 28     private boolean flag = false;
 29     
 30 //    同步设置
 31     private Lock lock = new ReentrantLock();
 32     private Condition con_pro = lock.newCondition();
 33     private Condition con_con = lock.newCondition();
 34     
 35     public void setPro(int pro){
 36         this.pro = pro;
 37     }
 38     public void setFlag(boolean flag){
 39         this.flag = flag;
 40     }
 41     public int getPro(){
 42         return pro;
 43     }
 44     public boolean getFlag(){
 45         return flag;
 46     }
 47     public Lock getLock(){
 48         return lock;
 49     }
 50     public Condition getCon_pro(){
 51         return con_pro;
 52     }
 53     public Condition getCon_con(){
 54         return con_con;
 55     }
 56 }
 57 
 58 class Producer implements Runnable {
 59     Product product = Product.getProduct();
 60     Lock lock = product.getLock();
 61     Condition con_pro = product.getCon_pro();
 62     Condition con_con = product.getCon_con();
 63     public void run() {
 64         while (true) {
 65             lock.lock();
 66             try {
 67 //                使用while循环判断标记,可以让线程被唤醒后再次判断while的条件标记。
 68                 while (product.getFlag()) 
 69                     con_pro.wait();    
 70                 int pro = product.getPro();
 71                 System.out.println(Thread.currentThread().getName()+"生产..."+(++pro));
 72                 product.setPro(pro);
 73                 product.setFlag(true);
 74             } catch (InterruptedException e) {
 75                 System.out.println("中断异常");
 76             } finally{
 77                 con_con.signal();;
 78                 lock.unlock();
 79             }            
 80         }
 81         
 82     }
 83 }
 84 
 85 class Consumer implements Runnable {
 86     Product product = Product.getProduct();
 87     Lock lock = product.getLock();
 88     Condition con_pro = product.getCon_pro();
 89     Condition con_con = product.getCon_con();
 90     public void run() {
 91         while (true) {
 92             lock.lock();
 93             try {
 94                 while (!(product.getFlag()))
 95                     con_con.wait();
 96                 int pro = product.getPro();
 97                 System.out.println(Thread.currentThread().getName()+"消费..........."+pro--);
 98                 product.setPro(pro);
 99                 product.setFlag(false);
100             } catch (InterruptedException e) {
101                 System.out.println("中断异常");
102             } finally{
103                 con_pro.signal();
104                 lock.unlock();
105             }
106         }            
107     }        
108 }

 

      运行结果为多个线程不断循环生产1个,消费1个,可以看出生产行为和消费行为达到多线程同步,满足需求。

      其中关键点:

      1.产品是生产者和消费者的共用数据,利用单例设计模式创建产品对象,确认唯一性。
  2.设置标记,通过标记来控制生产消费的次序。

 

posted on 2015-07-25 18:16  丨敲破苍穹灬  阅读(200)  评论(0)    收藏  举报