
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
学习如何使用线程池技术是每一位Java编程开发程序员都需要熟练掌握的一个编程开发技术,下面我们就通过案例分析来了解一下,线程池阻塞队列应用与类型分析。
1、线程池为什么使用阻塞队列?
阻塞队列,先是一个队列,肯定具有先进先出的属性。
而阻塞,则是这个模型的演化,一般队列,可以用在生产消费者模型,也就是数据共享,有人往里面放任务,有人不断的往里面取出任务,这是一个理想的状态。
但是倘若不理想,产生任务和消费任务的速度不一样,要是任务放在队列里面比较多,消费比较慢,还可以慢慢消费,或者生产者得暂停一下产生任务(阻塞生产者线程)。可以使用offer(Eo,longtimeout,TimeUnitunit)设定等待的时间,如果在指定的时间内,还不能往队列中加入BlockingQueue,则返回失败,也可以使用put(Object),将对象放到阻塞队列里面,如果没有空间,那么这个方法会阻塞到有空间才会放进去。
如果消费速度快,生产者来不及生产,获取任务的时候,可以使用poll(time),有数据则直接取出来,没数据则可以等待time时间后,返回null。也可以使用take()取出一个任务,没有任务就会一直阻塞到队列有任务为止。
2、上面说了阻塞队列的属性,那么为啥要用呢?
如果产生任务,来了就往队列里面放,资源很容易被耗尽。
创建线程需要获取锁,这个一个线程池的全局锁,如果各个线程不断的获取锁,解锁,线程上下文切换之类的开销也比较大,不如在队列为空的时候,然一个线程阻塞等待。
3、常见的阻塞队列
ArrayBlockingQueue:基于数组实现,内部有一个定长的数组,同时保存着队列头和尾部的位置。
LinkedBlockingQueue:基于链表的阻塞对垒,生产者和消费者使用独立的锁,并行能力强,如果不指定容量,默认是无效容量,容易系统内存耗尽。
DelayQueue:延迟队列,没有大小限制,生产数据不会被阻塞,消费数据会,只有指定的延迟时间到了,才能从队列中获取到该元素。
PriorityBlockingQueue:基于优先级的阻塞队列,按照优先级进行消费,内部控制同步的是公平锁。
SynchronousQueue:没有缓冲,生产者直接把任务交给消费者,少了中间的缓存区。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。