ReentrantLock与Condition的使用Demo

  |   0 评论   |   1,969 浏览

    package com.gofun.ms.common;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * 生产和消费
     * Lock与synchronized区别(本文未提到sync)
     * ReentrantLock与Condition的使用Demo
     * 
     * 题目:要求线程之间按顺序调用,A>B>C
     * 需求:A线程打印5次,B线程打印10次,C线程打印15次
     * 		A线程打印5次,B线程打印10次,C线程打印15次
     * 		A线程打印5次,B线程打印10次,C线程打印15次
     * 		...
     * 		依次10轮
     * 
     * 提醒:
     * 判断锁/执行业务/唤醒下一个线程
     * @author tonfay
     *
     */
    public class TestProdConsumer2 {
    
    	public static void main(String[] args) throws Exception {
    		Kongtiao1 kongtiao = new Kongtiao1();
    		for (int i = 1; i <= 10; i++) {
    
    			new Thread(new Runnable() {
    				@Override
    				public void run() {
    					kongtiao.print5();
    				}
    			}, "A").start();
    
    			new Thread(new Runnable() {
    				@Override
    				public void run() {
    					kongtiao.print10();
    				}
    			}, "B").start();
    
    			new Thread(new Runnable() {
    				@Override
    				public void run() {
    					kongtiao.print15();
    				}
    			}, "C").start();
    		}
    	}
    }
    
    class Kongtiao1 {
    	Integer number = 1;// 1:print5;2:pring10;3:pring15
    	Lock lock = new ReentrantLock();
    	Condition a = lock.newCondition();
    	Condition b = lock.newCondition();
    	Condition c = lock.newCondition();
    
    	public void print5() {
    		lock.lock();
    		try {
    			while (number != 1) {
    				a.await();
    			}
    			for (int i = 1; i <= 5; i++) {
    				System.out.println(Thread.currentThread().getName() + "\t print5 \t" + number);
    			}
    			number = 2;
    			b.signalAll();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			lock.unlock();
    		}
    	}
    
    	public void print10() {
    		lock.lock();
    		try {
    			while (number != 2) {
    				b.await();
    			}
    			for (int i = 1; i <= 10; i++) {
    				System.out.println(Thread.currentThread().getName() + "\t print10 \t" + number);
    			}
    			number = 3;
    			c.signalAll();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			lock.unlock();
    		}
    	}
    
    	public void print15() {
    		lock.lock();
    		try {
    			while (number != 3) {
    				c.await();
    			}
    			for (int i = 1; i <= 15; i++) {
    				System.out.println(Thread.currentThread().getName() + "\t print15 \t" + number);
    			}
    			number = 1;
    			a.signalAll();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			lock.unlock();
    		}
    	}
    }
    

    评论

    发表评论

    validate