关于EDU.oswego.cs.dl.util.concurrent包中线程队列的问题

grubby4k 2010-02-25 05:15:14
最近由于遇到一个需要线程池的小项目,我就使用了concurrent包。
由于以前没用过该jar,学习了一下里面关于线程池的写法。
发现一个问题,在主线程池PooledExecutor中创建线程队列的时候(我选择的是LinkedQueue),发现LinkedQueue与其他队列(BoundedPriorityQueue,BoundedLinkedQueue)不一样。该队列初始化的时候没有指定队列最大长度,只是有一个Command进入队列后,队列长度+1。
我这边的场景是设备会自主发消息到我的系统上。系统接到消息就创一个Command进入队列,最大消息并发数为10000。
我对linkedQueue的最大容量就没了把握。
问题1:LinkedQueue的最大容量是多少?
问题2:LinkedQueue开辟的资源应该是在内存吧?
问题3:如果我使用BoundedLinkedQueue,和原来LinkedQueue有啥区别?

谢谢大侠们来拍我!
...全文
1020 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
soar110 2010-05-04
  • 打赏
  • 举报
回复
学习下
  • 打赏
  • 举报
回复
LinkedQueue 无界 FIFO 阻塞队列
BoundedLinkedQueue 有界 FIFO 阻塞队列
BoundedPriorityQueue 有界优先阻塞队列

优先队列,并不是按照 FIFO(先进先出的顺序)来处理的,而是按照比较器的优先顺序来处理的,谁的优先级高谁就排在最前面,谁就会被优先取出。
  • 打赏
  • 举报
回复
无界队列可以一直往里面 put 东西直接 JVM 内存溢出。

有界队列的长度是有限的,当队列中的数据塞满了,而没及时 take 掉的话,在该队列上执行 put 方法时会阻塞掉,直接队列是空出一个位置了,如果一直不空,那就一直会阻塞在那里。
龙四 2010-02-25
  • 打赏
  • 举报
回复
jdk1.5中的java.util.concurrent和EDU.oswego.cs.dl.util.concurrent都是DL搞的
grubby4k 2010-02-25
  • 打赏
  • 举报
回复
引用 2 楼 nickycheng 的回复:
才知道有个EDU.oswego.cs.dl.util.concurrent包。
看api感觉和jdk中的java.util.concurrent包类似啊,而且人家也建议说用jdk里的替代。


恩,EDU.oswego.cs.dl.util.concurrent是java.util.concurrent的原型。JDK1.5加入了这个包。

我现在就怕LinkedQueue溢出(因为这个队列是根据jvm内存来的),万一jvm内存很紧张的话,会导致消息丢失。
但是用BoundedLinkedQueue又怕增加系统开销。看来我只有内部写个小程序测试一下,临界点是多少了。但是总觉得我模拟的小程序,还不够真实。问题在于不能模拟出真实系统的JVM内存开销。
nickycheng 2010-02-25
  • 打赏
  • 举报
回复
才知道有个EDU.oswego.cs.dl.util.concurrent包。
看api感觉和jdk中的java.util.concurrent包类似啊,而且人家也建议说用jdk里的替代。

Note: Upon release of J2SE 5.0, this package enters maintenance mode: Only essential corrections will be released. J2SE5 package java.util.concurrent includes improved, more efficient, standardized versions of the main components in this package. Please plan to convert your applications to use them. (A few niche classes here have no equivalents in java.util.concurrent. They will become part of a follow-up add-on package that will also include other unstandardized classes.) If you cannot convert to J2SE5 immediately, consider using a backport of the main java.util.concurrent classes by Dawid Kurzyniec .

1.无限大
2.是的,随队列容量增大而增大
3.BoundedLinkedQueue。LinkedQueue区别貌似就是前一个会有容量限制,可以控制插入队列的策略。后面一个就无限增大啦。
小贝壳666 2010-02-25
  • 打赏
  • 举报
回复
LinkedQueue的部分代码如下
  /** Main mechanics for put/offer **/
protected void insert(Object x) {
synchronized(putLock_) {
LinkedNode p = new LinkedNode(x);
synchronized(last_) {
last_.next = p;
last_ = p;
}
if (waitingForTake_ > 0)
putLock_.notify();
}
}

我也没做过,就你的问题我的答案如下:
问题1:LinkedQueue的最大容量是多少?
没最大容量限制
问题2:LinkedQueue开辟的资源应该是在内存吧?
是虚拟机内存
问题3:如果我使用BoundedLinkedQueue,和原来LinkedQueue有啥区别?
BoundedLinkedQueue与LinkedQueue的实现方式应该不同,具体看源码,功能是类似的,至于替换了是否好用,LZ自已试试吧。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧