1.业务场景,实现一个排队功能,比如 1,2,3 执行完成之后,重新从1,2,3 继续执行下去
public static void main(String[] args) { final Business business=new Business(); new Thread(new Runnable() { @Override public void run() { for (int i=0;i<100;i++){ business.one2(); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i=0;i<100;i++){ business.one3(); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i=0;i<100;i++){ business.one1(); } } }).start(); } } class Business { Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); int lockCount = 1; public void one1() { lock.lock(); if (lockCount != 1) { try { condition1.await(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("----one1"); lockCount = 2; condition2.signal(); lock.unlock(); } public void one2() { lock.lock(); if (lockCount != 2) { try { condition2.await(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("----one2"); lockCount = 3; condition3.signal(); lock.unlock(); } public void one3() { lock.lock(); if (lockCount != 3) { try { condition3.await(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("----one3"); lockCount = 1; condition1.signal(); lock.unlock(); } }
关键知识点:
Condition 中signal 唤醒一个在此条件下正在等待的线程,signalAll 唤醒在此条件下等待的所有线程
方法解释:Lock 获取锁 lock.tryLock() : 尝试去获取空闲的锁,如果有返回true,没有返回false;
lock.lock() :获取锁,会不停的获取,产生阻塞,已经被中断,但还会继续获取
lock.tryLock(time,类型) 获取最大这个时间之后,如果 time之后还未获取到锁,会抛出异常 InterruptedException
lock.lockInterruptibly 获取锁,如果已经中断了,停止,lockInterruptibly()和上面lock是一样的