00:00
各位同学大家好,欢迎继续收看GUUC高并发编程。下面我们来学习guc中另外一个重要的知识点,阻塞队列block q。首先给大家介绍一下阻塞队列的基本概念到底是怎么样的。说到阻塞队列,也就这个队列,咱们必须提到两个重要的数据结构,一个结构叫对立,一个结构叫做站。那给大家说一下,咱先说这个队列,大家想一下队列有什么特点。各位可以考虑一下什么特点,是不是叫先进先出的特点啊,比如我现在我先过来,那我先做操作,我后过来,我就后进操作,就是通俗咱说的先来后到,比如说大家请的例子,比如现在啊,我这个教室中有很多人,那咱们这些人要从教室里边出去,咱是不是要排队依次往出走,第一个人过来,他先出去,第二人过来,他第二个出去,依此类推,这是不是就叫先进先出特点,也就是说好比说是这么一个过程。
01:07
比如我现在这个部分呢,就好比说是一个队列,然后队列里边应该是这么一个特点啊,比如现在这一个队列。然后我队列中,比如现在我进来了一个元素,那这个元素先进来,是不是先出去,比现在我又来了第二个元素,或者说又来了第三个元素,这个过程就是谁先进来谁是先出去,这是第一个。这是第二个。这是第三个,所以这个就叫先进先出,是队列的这么一个特点,然后说到对立,我们再提到一个重要的数据结构,叫做站,那大家想一下这个站有什么特点?什么特点,是不是叫后进先出,那给各位同学我在里边也画一下,比如我现在这一部分结构就是一个站。
02:04
然后我现在比如说我向站里边要放入咱们的内容,比如我现在放了第一个内容,或者第一个元素,放了第二个元素,然后又放了第三个元素,咱们编号就是这个一。这个是二,这个是三,大家注意这个过程啊,我刚才放的是不是123呀,而咱们从这里边往出取元素大要怎么取,是不是321啊,所以这就叫后进先出的特点,所以这是两种重要的数据结构,一个叫对立,一个叫债,各位把这个要清楚给他认识,而咱们现在讲的东西叫什么?阻塞对立,首先它也是一种对立,那阻塞对立到底是什么特点,下面给各位同学详细来解释一下。大家看我的课件中,我这里写到阻塞队列嘛,顾名思义,首先肯定是一个队列,然后它通过一个共享的队列,什么叫共享?
03:07
多个线程是不能同时进行操作呀,然后它可以使得这个数据由队列的一端进行输入,从另一端进行输出,也就是这张图上这个效果,然后大家看一下啊,这张图给各位我先截出来,然后咱们详细分析一下,这张图上说的就是咱们这个阻塞队列这个特点。那我现在给各位我来画一下。在里边组的队列,然后大家看啊,这个图怎么看?首先中间的部分叫blocking q,就是咱说的左侧队列,然后我现在有两个线程,这个是线程一,这是线程二,然后线程一它做件事情叫做put这个操作。Put什么意思?是往里面放东西,然后我线程二做件事情叫什么?
04:01
Cake是不是从里边取东西,在这过程中怎么做?我线程一往里边放元素,线程二从队列中取元素,这个队列是一个共享队列,它能用两个线程或者多个线程可以操作,一个往里半,一个从里边取,而这个过程有什么特点,给大家说一下啊,比如说我现在你看啊,我这队列我线程一往里边是不是能放元素,但是我队列不可能无限放的,是不是它有一个大小的限制,或者说有一个数量限制,当我队列中的元素放满之后,那我这个线程一往里边是不是就不能放,它就处于一个叫阻塞状态,等待它变空之后才能往里边放元素,而我线程二从里边是不是要取元素,而我取的话,里边元素肯定不是取之不尽,用之不绝的嘛,比如我现在我取元素。当我把这个队列中元素取。
05:01
取空之后是不是它又取不出来呀,当队列中元素变空之后,那我这个线程二处于是不是有一个等待或者说一个阻塞状态呀,只有里边有元素我才能从里边取出来,所以这就是阻塞,就这特点,一个往里放,一个从里边取,当里边放满之后我就阻塞,当里边取空之后我就阻塞,而它里边有空间我就往里放,它里边有元素我就从里边取,这个过程就是咱说的阻塞队列特点,但是我刚才说这过程一边放一边取,在这个阻塞队列中,它都是一手包办的,也就是说它都是自动化完成的。这是我们说明的一个特点,然后这个过程大家看我总结的这几句话,就是刚才我提到的,当队列为空的时候,那我从队列中获取元素就将阻塞,因为里边为空嘛,你取出来。而当队列是满的时候,我从队列里边添加元素的操作将被阻塞,因为里边已经放进去了,而我试图从功的队列中获取元素的线程将被阻塞,直到线程往里边插入新的元素。比如我现在take取元素,里边为空,我阻塞,当里边多处元素是不是能取到,下面是一样,我往里边要加内容,当它为满的时候,那我就阻塞,而这个时候你从里边取出元素或者移出元素,里边就变空了,那我们就能往里边添加元素,这个过程它都是自动化完成的。所以这个我们说的关于阻塞对列。
06:43
切的这个特点,各位把这张图给他能看懂,一个线程往里放,一个从里边取,当放满之后我就阻塞,当我取空之后就阻错,里边一旦为空的话,那我这里边可以往里面放元素,当它里边一旦发现有元素,我就可以从里边往出取元素,这就我们说的阻塞队列的这个特点。
07:08
各位,大家要知道。然后这个特点说完之后呢,下面给各位同学进来说明,其实这个阻塞队列呢,在咱们的多线程用语中,所谓的阻塞就是指的是啊,在某些情况下会挂起线程,一旦满足条件被挂起线程又会被自动唤醒。就是我刚才说这过程,当你这里边为空,我这个take这个线程是被挂起,当里边有元素,我是不能自动唤醒,从里边能取出那种,这就是它里边这个左队列特点,而咱为什么要用这个阻合队列呢?大家注意啊,因为它的好处就是呢,我们不需要关心什么时候需要阻塞线程,什么时候需要幻想线程,因为它的过程在这个阻塞队列中都是给咱们一手包办好的。
08:01
咱们直接用就可以了,里边的细节咱们不需要过多关心,因为它已经帮咱们实现了,比如说咱们用这个doc Java u content包里边用它实现,我们说这过程会特别方便,如果说在这个content包发布之前没有这种方式,咱要实现需要关注里边的很多细节,而用它之后可以给咱们带来很大的方便,所以这就是关于阻塞队列里边那个相关的特点,各位把这个记住,特别要知道这张图上咱们刚才画的这个过程。所以现在关于阻塞队列的概述给各位就说完了。关于它的特点。然后这个出来之后呢,下面呢,给大家再介绍一下阻塞队列这个基本的架构是怎么样,也就是它里边那个接口和类的一个关系是怎么样的,那我下面给各位来说一下。
09:01
咱们首先看一下我们的API文档中找到Java u coner包,然后在里边呢找到这个阻塞对立,注意别找错啊,叫broken cut是这么一个阻塞对立,然后咱们看这里写到它本身是个什么。接口,然后它的所有的超级口,就是它的负接口,有这个collection,有这个Q,是不是这个队列啊,包括这个,另外在这个接口下边有很多的实现类。比如说咱看一个啊,A ray blocking q是不是数组的,Link的是不是链表的,它有各种的实类,所以这就是他一个基本架构。它是一个接口,它有副接口,有这个collection,有个包括它下面有很多的实现类,其实这些实现类呢,就是阻塞队列中不同的这些类型。啊,包括在队列中有它相关的方法,比如说大家看有什么A呀,插入啊,有什么offer,包括有什么take等等方法,这些一会儿我们会做一个教学演示,所以现在咱就把这个阻塞队列的基本概念,包括它一个基本的架构给各位就介绍完成了,各位通过我的介绍对组合队列交一个最基本的认识,至少把这张图先能给他看懂。
我来说两句