我不知所措。我有一个阻塞请求
private class Consumer extends Thread {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
if (connection.isReady()) {
final Item item = queue.takeFirst();
try {
ListenableFuture<Result> listenableFuture = connection.submitItem(item);
Futures.addCallback(listenableFuture, new FutureCallBackImpl<Result>(item));
} catch (RejectedExecutionException e) {
LOGGER.debug("Slow down submission of tasks we have a queue full in connection");
queue.addFirst(item);
}
}
}
} catch (InterruptedException e) {
LOGGER.debug("Interrupted. I will not propagate up because I own this thread");
}
}
}
此代码通常会阻塞<code>队列。takeFirst()当队列中没有项目时。但是,一旦我按预期添加了项目,它就不会解除阻止。调试时,我可以看到队列
中的项目,并且当我停止Tomcat时,我会序列化队列
。启动后,我将对队列进行反序列化,并在那一点上对<code>队列进行反串行化。takeFirst()检索项目(与之前未检索的相同)并提交它。
有人有什么想法吗?
编辑
再强调一下我的观点。如果我使用 queue.pollFirst() 更改 queue.takeFirst()
并稍微调整代码以忽略产生空
项
的传递,那么代码将按预期工作。
所以让我解释一下为什么下次将项目添加到队列时(即在它首先将所有元素出列之后)这段代码将不起作用
当队列第一次变空时,对这段代码的调用最终项目=queue.take第一();
将抛出中断异常,该异常被同时循环外部的代码捕获,因此代码将永远不会再次返回到同时循环。将第一个尝试块放在同时循环中将解决第一个问题。
其次,它需要调用Thread.currentThread()。中断()
在捕捉块中传递下一次的同时条件,以便它准备好读取将来添加到队列中的元素。事实上,我不明白调用这一行代码的原因。Thread.current线程()。is中断())
。
目前我正在为BlockingDeque(进展中)写有趣的博客,很快你会在我的博客上找到更多信息http://singletonjava.blogspot.com
也许你的代码没有输入if
,因为connection.isReady()
返回false
。
检查它以确保它确实停止等待队列中的第一项。
我有一个应用程序,在其中按下开始按钮后,服务将开始轮询几个传感器,每当传感器值发生变化时,将传感器数据存储到某个对象中。每10毫秒,就会发生一次数据库插入,获取对象的当前值并将其存储到数据库中。这会发生30分钟 考虑到插入的速度和持续时间,我想在一个独立于UI线程的线程中运行它,这样导航就不会受到影响。因此,我的服务将通过将数据添加到队列中来为线程提供一些数据,然后另一个线程(消费者)将从队列中取
问题内容: 我正在尝试编写一个解决方案,其中单个线程会生成可并行执行的I / O密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制当前待处理的任务数。 如果我这样创建ThreadPoolExecutor: 然后,当队列已满并且所有线程都已经繁忙时,抛出该异常。 当队列已满并且所有线程都忙时,我该怎么做才能阻塞? 编辑 :我试过了: 它以某种微妙的方式达到了我想要达到的效果(基本上被拒绝的
问题内容: 我与CohortGroup和Employee有很多关系。每当我将Employee插入CohortGroup时,hibernate都会从解析表中删除该组,然后再次插入所有成员以及新成员。为什么不只是添加新的呢? 组中的注释: 员工的另一边 代码嗅探 下面是日志中报告的SQL 这种接缝的效率很低,并且会引起一些问题。如果有人提出要求将雇员添加到组中,则有些人将其改写。 诸如equals和h
问题内容: 在Python文档中, 最低值的条目首先被检索(最低值的条目是由返回的条目)。条目的典型模式是形式为的元组。 看来队列将按优先级排序,然后按数据排序,这可能并不总是正确的。假设数据“项目2”在“项目1”之前入队,则项目1仍将排在第一位。在另一个文档页面heapq中,它建议使用计数器。所以我将数据存储为。是否没有类似的东西 那我就不需要自己执行订购吗? 问题答案: 据我所知,您要找的东西
假设一个线程在条件变量上阻塞: 互斥锁被解锁,尝试锁定互斥锁的其他线程被解锁: 同时还有另一个线程正在等待获取关键部分的所有权: 现在的问题是:调用pthread_cond_signal()时,是否保证pthread_cond_wait()[1]将在pthread_mutex_lock()[2]之前解除阻塞? POSIX规范似乎没有说明这种情况。