当前位置:嗨网首页>书籍在线阅读

26-结果分析

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

结果分析

在本案例中,所有 Condition 对象实例都是通过 Lock 接口的 newCondition() 方法产生的。不过在使用这些条件之前,线程需要获得与该条件变量绑定的锁。因此开发者只能在线程上通过 Lock 接口的 lock() 方法获得条件变量锁后,才能继续对该条件进行相关的操作。换句话说,必须在线程中调用了同一个 Lock 对象的 lock()unlock() 方法之间使用条件变量。

当线程调用了条件的 await() 方法后,将自动释放线程上已经获得的锁,以保证其他线程能够成功进入由同一个锁保护的临界区代码中。

当一个线程调用了条件变量上的 `signal()` 方法或者 `signalAll()` 方法后(译者注:原书对 `signalAll()` 方法名拼写有误),它将会唤醒其他在同一个条件上等待的线程。但是这并不意味着线程唤醒后就满足了继续运行的条件,因此必须把 `await()` 方法添加在 `while` 循环中。如果当前线程继续往下执行的条件不能得到满足,则将通过 `await()` 方法继续保持循环。

开发者需要谨慎处理 await()signal() 两个方法。若在线程中调用了 await() 方法后却没有任何线程调用同一个条件的 signal() 方法,则该线程将永远不会被唤醒。

线程通过 await() 方法沉睡后可能会由其他线程中断,因此开发者要谨慎处理抛出的 InterruptedException 异常。