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接口 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1728323519a1154137.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论