说到java的塞队列,我们会想到javajdk中有这么多类别

说到java的塞队列,我们会想到javajdk中有这么多类别。

1.ArrayDeque(数组双端队列)2.PriorityQueue(优先队列)3.ConcurentLinkedQue(以链表为基础的并发队列)4.DelayQue(延期堵塞队列)(堵塞队列实现了BlockingQue接口)5.ArrayBlockingQueue(数组并发堵塞队列)6.LinkedblockedblingQue接口)5.ArrayBlockingQuengQue(数组并发堵塞队列)6.LinkedblockedblingQuengQueyQue)

这里不是详细说明的,而是从线程池的异常说明。

结构线程池异常-线程池过载异常。

(标题){标题}{标题{标题}{标题}{标题{标题}{标题{标题}(2,2,1000,标题}

这个代码直接运行的话会出现异常。

工作室/工作室/工作室

总结一下:其实,这个问题是,由于加入的线程数超过了整个线程池能够负荷的最大数量(新建线程池时使用了有界队列),所以发生了异常。

避免线程池溢出异常-使用无界队列和有界队列。

BlockingQueue。

这是为了解决java并发同步问题,本质上是为了解决线间信息同步而设计的。

有几个类别:

1.DelayQueue(延期堵塞队列)(堵塞队列实现了BlockingQue接口)这个队列是无界的,没有指定长度的构造方法2.ArrayBlockingQueue(基于几组并发堵塞队列)必须设定长度3.LinkedBlockingQueue(基于链表的FIFO堵塞队列)没有指定长度的相反,有界限的4.LinkedblockedBlockingDequequeue)只能指定长度的相反,没有界定长度的5.LinkerayQuequequequequequeuequequeue。

回来看看上面的源代码。其实线程池加入线程时的逻辑是这样的。

建立常驻线程coreNum指定,超过时建立临时线程maxNum,还不够,增加到队列中。

线程池判断能否增加只有对列是使用的队列的offset方法。

publicvoidexecute(Runnablecomand){if(comand==null)thrownewnullPointexception();if(workerCountOf(c)如果是有界的队列党对列,自然会回到false,因为不能追加,所以会出现异常。

总结一下。

使用java线程池时,需要制定容量计划,如果无法确定是否超过指定的线程数量,则可以使用无界队列,但必须注意防止内存泄漏。


相关内容

实战教学·项目驱动

132 2811 3191
预约免费试学
点击咨询
预约试学