1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;
@SuppressWarnings("all") public class producersAndConsumers2 { public static void main(String[] args) { AirCondition airCondition=new AirCondition(); new Thread(()->{ for (int i = 0; i <10 ; i++) airCondition.decrement();},"线程A").start(); new Thread(()->{ for (int i = 0; i <10 ; i++) airCondition.increment();},"线程B").start(); new Thread(()->{ for (int i = 0; i <10 ; i++) airCondition.decrement();},"线程C").start(); new Thread(()->{ for (int i = 0; i <10 ; i++) airCondition.increment();},"线程D").start(); } } class AirCondition{ private int number=0; final Lock lock=new ReentrantLock(); final Condition condition = lock.newCondition();
public void increment(){ lock.lock(); try { while(number!=0){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } number++; System.out.println(Thread.currentThread().getName()+":\t"+number); condition.signalAll(); }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } public void decrement(){ lock.lock(); try { while(number==0){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } number--; System.out.println(Thread.currentThread().getName()+":\t"+number); condition.signalAll(); }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } }
|