SynchronousQueue介绍
SynchronousQueue作为阻塞队列,区别于其他的阻塞队列。因为他不存储元素,但是存储消费者或者生产者。要是SynchronousQueue队列中存储了一个生产者,再来一个生产者想存放到队列中,要是你使用的是put方法,那么就会阻塞。
生产者在SynchronousQueue队列中存在几种结果:
1.如果在阻塞期间有消费者来消费,生产者就会将阻塞的信息交给消费者消费。
2.生产者会阻塞等待结果。要是不允许阻塞那就直接失败。
3.生产者在阻塞期间,要是发生线程中断那就结束了。
消费者和生产者的逻辑效果是一样的。
生产者和消费者的数据是直接传递的,不会经过SynchronousQueue。SynchronousQueue也不会存储数据,只是作为一个数据交换的媒介!
生产者和消费者的基本方法
生产者:
offer()方法,不带有时间参数的是将消息放到SynchronousQueue队列的时候,要是存在消费者在等待消息,那就直接配对。要是没有消费者在等待消息。那就直接返回,886!
offer()方法带有时间参数的,生产者将消息放到SynchronousQueue,还是要是存在消费者等待消息,那就直接配对成功好了,要是没有消费者等待消息,那就阻塞等到time时间,要是还是没有消费者来,那就886!!!
put方法则是生产者将消息放到SynchronousQueue队列中。要是存在消费者等待,那配对成功,要是没有消费者等待,那就死等着,倔的很。
消费者:
poll()方法,不带有时间参数的是去从SynchronousQueue队列中消费信息,要是存在那就直接配对。要是没有生产者生产消息,那就直接返回886。
poll()方法带有时间参数的,消费者去SynchronousQueue队列中消费消息,要是此时此刻存在生产者生产消息,那太好了。直接配对。要是此时此刻没有生产者生产消息。那就阻塞等待time的时间,要是还是没有那就886。
take()方法是消费者去SynchronousQueue消费消息,要是没有生产者生产消息,我就死等!!!!
效果演示
- 创建一个SynchronousQueue队列,该队列不存储数据没有长度的概念。默认是false,栈实现
生产消息的效果演示
生产者生产完立刻走,消费者来不及遇见,拿取不到数据
通过主线程创建一个子线程,然后子线程丢数据进队列,并让主线程休眠100毫秒。确保下一个新的子线程创建出来的时候上一个子线程一定已经将数据丢进队列中。