草庐IT

阻塞队列--LinkedBlockingQueue

全部标签

java - 阻塞、锁定和隔离级别之间的关系是什么?

我了解一些关于Oracle阻塞的知识——更新如何阻塞其他更新直到事务完成,写入者如何不阻塞读取者等。我理解悲观和乐观锁定的概念,以及有关丢失更新等典型银行教科书示例。我也理解JDBC事务隔离级别,例如,我们很高兴看到未提交的数据。不过,我对这些概念之间的关联和相互作用有点模糊。例如:Oracle是否提供悲观或默认乐观锁定(它似乎只是阻止了单独的更新基于两个实验TOADsession。)如果像我怀疑的那样,这些是应用层概念,为什么会我不厌其烦地实现一个当我可以让数据库同步事务无论如何更新?当除我的应用程序之外的其他客户端使用不同的隔离级别访问时,事务隔离级别(我在连接上设置)如何改变数据

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

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

java - 如何在不使用选择器的情况下实现阻塞 DatagramChannel 的超时处理

我觉得我在这里遗漏了一些非常明显的东西。我的系统的整体结构使我想使用不带选择器的阻塞DatagramChannel,以保持简单。我试图通过在套接字上设置超时来实现超时处理,但这似乎没有效果。这段伪代码暗示了我正在努力实现的目标。DatagramChannelchannel=DatagramChannel.open();channel.socket().bind(someaddress);channel.socket().setSoTimeout(3000);channel.send(outBuffer,peerAddress);channel.receive(inBuffer);另一方

java - 您能否在 Java 嵌入式代理中以编程方式更改队列的 "dead letter"处理?

背景在高层次上,我有一个Java应用程序,其中某些事件应触发要为当前用户执行的特定操作。但是,事件可能很频繁,Action总是一样的。因此,当第一个事件发生时,我想安排在不久的将来某个时间点(例如5分钟)采取行动。在那个时间窗口内,后续事件不应该采取任何行动,因为应用程序看到已经安排了一个行动。一旦预定的Action执行,我们就回到第1步,下一个事件再次开始循环。我的想法是通过在应用程序本身中嵌入一个内存中的ActiveMQ实例来实现这种过滤和限制机制(我不关心队列持久性)。我相信JMS2.0支持这种延迟传递的概念,延迟的消息位于“暂存队列”中,直到传递到真正的目的地为止。但是,我也相

java - 使用 Spring Cloud Stream 将 RabbitMQ 消费者绑定(bind)到现有队列

我使用RabbitMQ网络用户界面创建了一个主题交换TX并绑定(bind)到交换两个队列TX.Q1和TX.Q2,每个都与路由键rk1和rk2相应地绑定(bind),并向交换生成少量消息。现在我想使用SpringCloudStream创建一个消费者,它只会从Q1获取消息。我尝试使用配置:spring.cloud.stream.bindings.input.destination=TXspring.cloud.stream.bindings.input.group=Q1以及消费消息的方法的注解@StreamListner(Sink.INPUT)。结果我可以看到消费者创建了一个同名队列(或绑

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 - 将 HttpServletRequest 对象存储在队列中供以后处理是否危险?

所以,我处于一种情况,我想排队一堆HttpServletRequest对象进行异步处理。暂且不论这是否是一个明智的策略——在这种情况下它实际上是,因为我正在尝试改造一个糟糕的遗留系统——这是一件危险的事情吗?我在这里关心的是HttpServletRequest对象是否持有任何有值(value)的资源或打开的连接,这会导致死锁或资源争用问题。这里假设我正在使用doPost()方法实现一个简单的servlet,该方法获取HttpServletRequest对象,将其放入LinkedBlockingQueue,然后向用户发送某种库存响应(例如301重定向到确认页面).谢谢!

java - 为什么阻塞而不是循环?

编写以下代码被认为是不好的做法的原因有哪些?while(someList.isEmpty()){try{Thread.currentThread().sleep(100);}catch(Exceptione){}}//Dosomethingtothelistassoonassomethreadaddsanelementtoit.对我来说,选择一个任意值来hibernate不是一个好的做法,在这种情况下我会使用BlockingQueue,但我想知道是否有不止一个原因不应该写这样的代码。 最佳答案 它在对事件采取行动之前平均延迟50毫秒

java - ActiveMQ 从队列中获取所有消息

我想创建一些工具来管理队列中的消息。所以我希望能够从队列中获取所有消息(类似于导出)并且不要从那里删除它。我尝试使用JMXAPI:ObjectNamembeanNameQueue=newObjectName("org.apache.activemq:type=Broker,brokerName=static-broker1,destinationType=Queue,destinationName=tmp_queue2");org.apache.activemq.broker.jmx.QueueViewMBeanqueueView=JMX.newMBeanProxy(mbsc,mbea

java - 如何取消阻塞在 ServerSocket.accept() 上阻塞的线程?

我有一个带有这段代码的服务器线程:publicvoidrun(){try{ServerSocketserver;EneaLog.printLog("Serverisrunning.");server=newServerSocket(this.portnumber);while(true){newEneaServerConnection(server.accept(),this.project,stopped).start();if(stopped){EneaLog.printLog("Serversafe-shutdowncompleted.");EneaLog.printLog("H