jjzjj

LinkedBlockingQueue

全部标签

java - LinkedBlockingQueue 节点的 next 不可变

我正在阅读LinkedBlockingQueue代码,但我有一个问题,也许很简单,但我找不到答案,真的需要帮助。我注意到Node.next不是易变的,像这样:staticclassNode{Eitem;LinkedBlockingQueue.Nodenext;Node(Evar1){this.item=var1;}}那么,新节点(Node.next)的入队如何通过另一个线程对出队可见?privatevoidenqueue(Nodenode){//assertputLock.isHeldByCurrentThread();//assertlast.next==null;last=last

Java LinkedBlockingQueue 能够在完成时发出信号吗?

我的情况是单个生产者和单个消费者处理对象队列。队列可能为空有两种情况:消费者处理对象的速度比生产者生成新对象的速度快(生产者在生成对象之前使用I/O)。生产者已完成对象的生成。如果队列为空,我希望消费者等到新对象可用或生产者发出完成信号。到目前为止,我的研究让我一无所获,因为我仍然以一个同时检查队列和一个单独的boolean标志(isDone)的循环结束。鉴于没有办法等待多个锁(想到等待队列和标志),可以做些什么来解决这个问题? 最佳答案 首先,使用包装器“开销太大”的建议是一种猜测,IMO是一个非常糟糕的建议。这个假设应该通过具有

Java:LinkedBlockingQueue 是否考虑了消费者的顺序?

我有3个线程:2个消费者,ConsumerA和ConsumerB,以及一个Producer。我还有一个LinkedBlockingQueue队列在t=1时:ConsumerA调用queue.take()在t=2:ConsumerB调用queue.take()在t=3时:Producer调用queue.put(foo)是否保证ConsumerA在ConsumerB之前收到foo?换句话说,消费者调用take()的顺序就是每个消费者被通知的顺序?如果没有,是否有替代数据结构可以根据顺序给予更高的优先级? 最佳答案 从查看源代码来看,并不

java.util.concurrent.LinkedBlockingQueue put 方法在 Scala 中需要 Nothing 作为参数

这是代码片段-importjava.util.concurrent.LinkedBlockingQueuedefmain(args:Array[String]){valqueue=newLinkedBlockingQueuequeue.put("foo")}这给了我-错误:类型不匹配;找到:java.lang.String("foo")要求:无queue.add("foo")我的理解是因为我没有指定进入队列的元素的类型。如果是这样,我们如何在Scala中为LinkedBlockingQueue指定类型而不是默认的通用类型? 最佳答案

java - LinkedBlockingQueue unbounded 和 LinkedBlockingQueue with capacity 哪个更好

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion我在ThreadPoolExecutor中使用LinkedBlockingQueue作为工作队列。问题是我应该使用有界LinkedBlockingQueue还是无界LinkedBlockingQueue。我已经重写了ThreadPoolExecutor的execute方法,不再面临核心池大小后创建线程的问题。所以请告诉我使用有界或无界的LinkedBlockingQueue哪个更好。谢谢,

java - 使用 LinkedBlockingQueue 对多线程 java 程序足够好吗?

我有一个消费者和一个生产者,它们从队列中添加和删除Item对象。如果我使用put()和take()方法。我还需要解决任何线程安全问题吗?这类似于有界缓冲区问题,我只是想知道是否使用阻塞队列来代替对信号量或监视器的需求。Item对象本身可能需要同步(setter但getter不需要锁),对吗?最后,我不太确定如何测试它是否是线程安全的,因为我不能同时让两个线程调用take()因为执行顺序是不确定的。有任何想法吗?谢谢。 最佳答案 对于您正在做的事情,它是完全线程安全的,事实上这就是它的设计目的。BlockingQueue的说明(这是L

java - 从 LinkedBlockingQueue 迁移到 LMAX 的 Disruptor

是否有从标准LinkedBlockingQueue迁移的一些示例代码至LMAX'Disruptor建筑学?我有一个可能会从更改中受益的事件处理应用程序(单个生产者、多个消费者)。当我的目标是最大化吞吐量而不是最小化延迟时,它甚至有意义吗? 最佳答案 Mentaqueue基于相同的想法提供单一生产者单一消费者队列-http://mentaqueue.soliveirajr.com/Page.mtw,您可以检查代码,尽管我自己从未使用过它。开箱即用的Disruptor在这里提供了两种技术-我不会深入探讨代码,但如果您需要,可以这样做。它

用于高并发情况的Java有界非阻塞缓冲区

基本上我需要一个数据结构来存储服务器端的临时聊天消息。应该是:有界:因为我不需要存储太多消息,客户端会每秒发送一次获取新消息的请求。我认为绑定(bind)大小应该是最大值。一秒钟内并发请求的数量。当缓冲区已满时,旧消息将被删除。适合高并发访问:我不想使用Collections.synchronizedXXXX这样的数据结构,因为在迭代过程中,如果其他线程改变了数据结构,例如添加一条消息,它会抛出一个异常,所以我必须锁定整个数据结构,实际上我并不关心客户端请求是否可以获得最后插入的消息,因为他们会在一秒钟后发送一个新请求,另一方面,写操作应该永远不会延迟。包java.util.concu

java - 为什么 ArrayBlockingQueue 称为有界队列,而 LinkedBlockingQueue 称为无界阻塞队列?

据我所知,链表和数组都可以无限增长,还是我错了?但是当我经历了documentationintheExecutorService我看到这个:Unboundedqueues.Usinganunboundedqueue(forexampleaLinkedBlockingQueuewithoutapredefinedcapacity)willcausenewtaskstowaitinthequeuewhenallcorePoolSizethreadsarebusy.Thus,nomorethancorePoolSizethreadswilleverbecreated.(Andthevalue

CPU 负载中的 Java 多线程

我对运行多个Java线程的应用程序有点问题。该应用程序运行多个工作线程,这些线程持续查看输入队列,如果队列中有消息,它们就会将它们拉出并进行处理。在这些工作线程中,有另一个验证线程计划在固定时间执行检查以查看主机(运行应用程序的主机)是否仍处于运行应用程序的“良好状态”。此线程更新一个AtomicBoolean值,该值又由工作线程在开始查看主机是否正常之前进行验证。我的问题是,在CPU负载较高的情况下,负责验证的线程将花费更长的时间,因为它必须与所有其他线程竞争。如果AtomicBoolean在一定时间后没有得到更新,它会自动设置为false,给我带来严重的瓶颈。我最初的方法是增加验证