admin管理员组

文章数量:1599541

Condition接口

Condition是j.u.c包下提供的一个接口。可以翻译成 条件对象,其作用是线程先等待,当外部满足某一条件时,在通过条件对象唤醒等待的线程。

void await() throws InterruptedException;让线程进入等待,如果其他线程调用同一Condition对象的notify/notifyAll,那么等待的线程可能被唤醒。释放掉锁

void signal();唤醒等待的线程

void signalAll();唤醒所有线程

练习题:

写2个线程,其中一个打印1-52,另一个打印a-z,打印顺序应该是12a34b56c……5152

  • 线程1执行2次数后,线程2执行1次输出

    public class T1 {
    private static final Lock lock = new ReentrantLock();
    private static final Condition conNum = lock.newCondition();
    private static final Condition conChar = lock.newCondition();
    private boolean flag = false;

      public void printNum() {
      	try {
      		lock.lock();
      		for (int i = 1; i <= 52; i++) {
      			while (flag)
      				try {
      					conNum.await();
      				} catch (InterruptedException e) {
      					e.printStackTrace();
      				}
      			System.out.print(i);
      			if (i % 2 == 0) {
      				flag = !flag;
      				conChar.signal();
      			}
      		}
      	} finally {
      		lock.unlock();
      	}
      }
    
      public void printChar() {
      	try {
      		lock.lock();
      		for (int i = 'a'; i <= 'z'; i++) {
      			while (!flag)
      				try {
      					conChar.await();
      				} catch (InterruptedException e) {
      					e.printStackTrace();
      				}
      			System.out.print((char)i);
      				flag = !flag;
      				conNum.signal();
      		}
      	} finally {
      		lock.unlock();
      	}
      }
      public static void main(String[] args) {
      	T1 tt=new T1();
      	new Thread(()->{
      		tt.printNum();
      	}).start();
      	new Thread(()->{
      		tt.printChar();
      	}).start();
      }
    

    }

使用Condition的特殊点:

  • 当调用condition.await()阻塞线程时会自动释放锁,不管调用了多少次lock.lock(),这时阻塞在lock.lock()方法上线程则可以获取锁
  • 当调用condition.signal()唤醒线程时会继续上次阻塞的位置继续执行,默认会自动重新获取锁(注意和阻塞时获取锁的次数一致)

本文标签: 接口condition