问题标签 [blockingqueue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
10337 浏览

java - 是否建议向 ThreadPoolExecutor 的 BlockingQueue 添加任务?

ThreadPoolExecutor的 JavaDoc不清楚是否可以直接将任务添加到BlockingQueue后备执行程序。文档说调用executor.getQueue()“主要用于调试和监控”。

我正在ThreadPoolExecutor用我自己的BlockingQueue. 我保留了对队列的引用,因此可以直接向其中添加任务。返回相同的队列getQueue()所以我假设警告getQueue()适用于通过我的手段获得的支持队列的引用。

例子

代码的一般模式是:

queue.offer()对比executor.execute()

据我了解,典型用途是通过executor.execute(). 我上面示例中的方法具有阻塞队列的好处,而execute()如果队列已满并拒绝我的任务,则会立即失败。我也喜欢提交作业与阻塞队列交互;这对我来说感觉更“纯粹”的生产者消费者。

直接将任务添加到队列的含义:我必须调用prestartAllCoreThreads()否则没有工作线程正在运行。假设没有与执行程序的其他交互,则不会监视队列(ThreadPoolExecutor来源检查证实了这一点)。这也意味着对于直接入队,ThreadPoolExecutor必须另外为 > 0 个核心线程进行配置,并且不得将其配置为允许核心线程超时。

tl;博士

给定一个ThreadPoolExecutor配置如下:

  • 核心线程 > 0
  • 核心线程不允许超时
  • 核心线程已预先启动
  • 持有对BlockingQueue支持执行者的引用

将任务直接添加到队列而不是调用是否可以接受executor.execute()

有关的

这个问题(生产者/消费者工作队列)类似,但不具体涉及直接添加到队列中。

0 投票
1 回答
1129 浏览

java - Java进程产生了数千个线程......为什么?

我最近在运行 Java 进程时遇到了客户迁移到 Linux(64 位)的问题。

该进程产生了数千个线程,其中大多数线程的标识符为 futex。我查看了 futex (快速用户空间互斥锁),它是实现基本锁定的 Linux 构造。

代码最近更改为实现 BlockingQueue 和 ExecutorService 以生成子线程,但子线程的数量由配置设置控制,我可以证明这种特定机制并没有失控。我只能假设由于 BlockingQueue 和一些锁,JVM 内部的某些东西正在产生所有这些线程?

那么谁能告诉我如何找出这些线程实际上是什么以及我可以做些什么来控制/停止它们?

以下是进程列表的几行;必须终止进程之前的实际列表超过 13000 行。

0 - 54321 447 446 1 - - - 5953085 - ? 00:15:50 java
0 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -

任何建议都欣然接受。

0 投票
1 回答
3082 浏览

java - LinkedBlockingQueue 抛出 InterruptedException

我有这段代码。A只应在等待添加到队列时LinkedBlockingQueue抛出if 中断。Exception但是这个队列是无界的,所以它应该尽快添加。为什么我的关闭方法会抛出一个InterruptedException

0 投票
2 回答
2252 浏览

c# - 有没有并发无锁阻塞队列的实现?

我知道阻塞队列和无锁队列,这是Scott 等人提供的这些实现的一个很好的例子。,但是有无锁阻塞队列的实现吗?

在无锁阻塞队列中,出队不需要锁定,但如果队列中没有项目,它将阻塞消费者。有没有这种野兽的实现?我更喜欢它们是 C# 实现,但任何实现在技术上都可以工作。

更新:

我想我最终在 D14.1 行出现了竞争条件:

0 投票
3 回答
3619 浏览

java - Java - LinkedBlockingQueue 问题

我的问题是当条件 1 为真时,我将对象放回队列中。但最初它在队列的顶部,但在放置后,它将排在队列的末尾。
我的要求是:
1.我可以将元素放回队列顶部

2.不知何故我可以在第 5 行等待,而无需从队列中删除元素。

0 投票
1 回答
4813 浏览

java - 如何在阻塞队列实现中正确使用java通知

我正在尝试理解 Java 多线程构造,并且正在尝试编写阻塞队列的简单实现。这是我写的代码:

我想从 put() 通知在 Take() 中等待的线程,反之亦然。有人可以帮助我以正确的方式做到这一点。

我检查了 java.utils 的实现,它使用了 Condition 和 ReentrantLocks,这对我来说在这个阶段有点复杂。为了简单起见,我现在可以不完全健壮[但正确]。

谢谢 !

0 投票
2 回答
523 浏览

java - 分析 BlockingQueue 使用示例

我正在查看“基于典型生产者-消费者场景的使用示例”:http: //download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html#put (E )

示例正确吗?

我认为 put 和 take 操作需要在继续修改队列之前锁定某些资源,但这不会发生在这里。

此外,如果这是一种并发队列,那么缺少锁是可以理解的,因为并发队列上的原子操作不需要锁。

0 投票
2 回答
4648 浏览

java - 可调整大小的 Java BlockingQueue

所以我在生产者/消费者类型的应用程序中使用固定大小的 BlockingQueue [ArrayBlockingQueue],但我希望用户能够动态更改队列大小。问题是没有允许在创建后更改容量的 BlockingQueue 实现。以前有人遇到过这个吗?有任何想法吗?

0 投票
3 回答
7511 浏览

java - BlockingQueue 的 drainTo() 方法的线程安全

BlockingQueue的文档说批量操作不是线程安全的,尽管它没有明确提到方法 drainTo()。

BlockingQueue 实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,批量收集操作 addAll、containAll、retainAll 和 removeAll 不一定以原子方式执行,除非在实现中另外指定。因此,例如,addAll(c) 在仅添加 c 中的一些元素后可能会失败(抛出异常)。

drainTo() 方法的文档指定不能以线程安全的方式修改 BlockingQueue 的元素所排放到的集合。但是,它没有提到任何关于 drainTo() 操作是线程安全的。

从此队列中删除所有可用元素并将它们添加到给定集合中。此操作可能比重复轮询此队列更有效。尝试将元素添加到集合 c 时遇到的失败可能会导致在引发相关异常时元素既不在集合中,又不属于任何一个集合或两个集合。尝试将队列排空到自身会导致 IllegalArgumentException。此外,如果在操作正在进行时修改了指定的集合,则此操作的行为是未定义的。

那么,drainTo() 方法是线程安全的吗?换句话说,如果一个线程在阻塞队列上调用了 drainTo() 方法,而另一个线程在同一个队列上调用了 add() 或 put(),那么在这两个操作结束时队列的状态是否一致?

0 投票
2 回答
537 浏览

c++ - 阻塞队列实现:竞争条件在哪里?

又是我和我的 BlockingQueue……我根据这篇文章这个问题重写了它。它发送一些项目,然后因访问冲突而崩溃。这是代码:

它总是在对 Pop() 的调用中崩溃,在 if 之后的行中,它说:

它炸毁了 cos 的 pNewHeadNode 为 NULL。但这怎么会发生呢?

编辑:忘记初始化代码: