使用Lock锁生产者消费者模式
1 package com.java.concurrent; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurrent.locks.Lock; 5 import java.util.concurrent.locks.ReentrantLock; 6 7 /** 8 * 生产者消费者模式 9 * @author fliay 10 * 11 */ 12 public class TestProductorAndConsumerByLock { 13 14 public static void main(String[] args) { 15 ClerkByLock c = new ClerkByLock(); 16 ProductorByLock pro = new ProductorByLock(c); 17 ConsumerByLock con = new ConsumerByLock(c); 18 new Thread(pro,"生产者A").start(); 19 new Thread(con,"消费者B").start(); 20 new Thread(pro,"生产者C").start(); 21 new Thread(con,"消费者D").start(); 22 } 23 24 25 26 27 } 28 29 class ClerkByLock{ 30 //初始化产品 31 private int product = 0; 32 //定义一个Lock锁对象 33 private Lock lock = new ReentrantLock(); 34 //创建condition对象 35 private Condition condition = lock.newCondition(); 36 37 38 //进货 39 public void get(){ 40 lock.lock(); 41 42 try{ 43 while(product>=10){ 44 System.out.println("产品已满!"); 45 try { 46 //使用condition进行线程等待 47 condition.await(); 48 } catch (InterruptedException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 } 52 } 53 condition.signalAll(); 54 System.out.println(Thread.currentThread().getName()+":"+ ++product); 55 }finally{ 56 //始终会解锁 57 lock.unlock(); 58 } 59 60 61 62 63 } 64 65 //卖货 66 public void sale(){ 67 lock.lock(); 68 try{ 69 70 while(product<=0){ 71 System.out.println("补货中!"); 72 try { 73 condition.await(); 74 } catch (InterruptedException e) { 75 // TODO Auto-generated catch block 76 e.printStackTrace(); 77 } 78 } 79 condition.signalAll(); 80 System.out.println(Thread.currentThread().getName()+":"+ --product); 81 }finally{ 82 lock.unlock(); 83 } 84 85 86 } 87 } 88 89 class ProductorByLock implements Runnable{ 90 91 private ClerkByLock clerk; 92 93 94 public ProductorByLock(ClerkByLock clerk) { 95 this.clerk = clerk; 96 } 97 98 99 100 public void run() { 101 for(int i=0;i<20;i++){ 102 clerk.get(); 103 } 104 } 105 } 106 107 108 class ConsumerByLock implements Runnable{ 109 110 private ClerkByLock clerk; 111 112 113 114 public ConsumerByLock(ClerkByLock clerk) { 115 this.clerk = clerk; 116 } 117 118 119 120 public void run() { 121 for(int i=0;i<20;i++){ 122 clerk.sale(); 123 } 124 } 125 }
欢迎大家加入java资源免费分享群,群号:814657026