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