在学习线程池中,有一个重要的参数,BlockingQueue就是任务缓冲队列的实现(boundTask)。缓冲队列要实现的功能,出队和入队,当队列为空是出队的操作就会阻塞,等待放入新的数据。出队线程如何感知新数据的填入?按照我的理解有两种方式:
- 当前线程自旋获取数据
- 阻塞出队线程等待唤醒
第二种方法,就必须实现出队线程和入队线程之间的通信。在object对象中提供了wait()和notify()方法,这两个方法只能在同步代码块中使用。当出队线程阻塞是,调用notify(),并不能精确的出队线程(出队和入队共用一把锁,也正式因为共用一把锁,才能实现线程的通信)。想要区分,就要使用AQS的condition实现等待。
知道condition和wait()/notify()的区别和应用场景即可