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()唤醒线程时会继续上次阻塞的位置继续执行,默认会自动重新获取锁(注意和阻塞时获取锁的次数一致)