问题标签 [java.util.concurrent]
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.
java - Thread.interrupt() 和 java.io.InterruptedIOException
我在 Solaris 10 上运行 Java 1.5。我的程序是一个独立的 java 程序,使用 java 并发包和 log4j-1.2.12.jar 来记录某些信息。主要逻辑如下
在执行我的程序期间,有时(并非总是)我会收到此错误...
从调用返回后将无法中断 AppThread,super.run();
因为 woker 已经从内部使用的工作程序集中删除ThreadPoolExecutor
,执行程序从那时起没有对 AppThread 的引用。
顺便说一句:日志文件是可访问的并且大小足够大。
33是行:if (debug)
logger.info("Exiting " + getName());
另一个问题是,为了调试 的原因java.io.InterruptedIOException
,我添加了
在run
AppThread 方法的 finally 子句中。当InterruptedException
在 finally 子句中被捕获时,interrupt()
永远不会调用覆盖方法。那么谁来中断 AppThread 呢?是同一个人原因java.io.InterruptedIOException
吗?
java - 需要了解对象锁定信息
在 java 中,我创建了一个具有全局范围的对象。
在某些时候,我在另一个线程中,需要知道全局对象当前是否被任何线程锁定。
- 克里希纳
java - Java中获取锁的延迟通知
我们有一个用例,我们需要获取锁并在获取锁需要超过 5 分钟时发送通知。我们仍然应该永远等待锁定。
我们正在使用可重入锁,而 lock.tryLock(5, TimeUnit.Minutes) 是不够的,因为它会在 5 分钟后出来。
我们尝试的选项是:
但我想,这会导致失去锁的公平性(请求锁的顺序)
有没有人遇到过这样的用例,如果是,请解释它是如何解决的。
我们不希望在某些上下文中手动维护锁和相应的等待线程的元信息(例如何时启动以获取锁),并且另一个线程不断轮询整个上下文以查看它是否有任何等待线程等待超过 5 分钟。
java - java中Executor和ExecutorCompletionservice的区别
正如问题标题本身所说,java中的Executors和ExecutorCompletionService类有什么区别?
我是线程新手,所以如果有人可以用一段代码来解释,那将有很大帮助。
java - 具有多个监视器的 BlockingQueue 设计
我正在写一个 BlockingQueue 并且想知道其他实现如何解决这个问题:
如果我只有一个监视器(队列对象)并让生产者和消费者wait
,我将必须确保调用notifyAll
而不是notify
调用,否则即使队列已满,生产者也可能只会向另一个等待的生产者发出信号以继续。即使有东西,也让消费者等待。另一方面notifyAll
,对于许多线程和处理器来说,调用似乎不是一个可扩展的解决方案。
BlockingQueue
s 使用两个显示器吗?一种是生产者等待,一种是消费者等待?然后我必须以封装的方式同步队列和相关监视器。这是要走的路吗?
java - ExecutorService 的奇怪行为
我有 5000 个类似的 Callable 任务要在 Executors.newFixedThreadPool(8) 创建的 ExecutorService 的 8 个线程中执行。每个任务都进入数据库以检索大量数据以进行处理。
一切正常 99% 的时间,但有时我在日志文件中看到非常奇怪的执行日志消息,当 DB 很慢或卡住(不要问为什么)并且 8 个当前正在运行的任务在所有 8 个线程中都停止并且尚未完成, ExecutorService 开始提交更多的任务来一一执行!
所以日志显示,在某些时候 ExecutorService 发疯了,开始调用 Callable 的 call() 方法,等待队列中越来越多的任务没有等待前面的任务完成。越来越多的任务向 DB 发送请求,最终导致 DB 崩溃,Java 堆内存耗尽。
看起来 ExecutorService 内部发生了一些奇怪的事情,或者我对这种情况的理解是错误的。有没有人见过这样的东西?
我的大脑堆栈溢出了
ps 是来自 Java API 的引用:
Executors.newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads 个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。
如果我的任务导致线程死亡并且 ExecutorService 创建更多线程并向它们提交新的 8 个任务并且它们死亡并且 ExecutorService 创建更多线程并提交更多 8 个任务,这是否真的会发生?
pss:Callable 的 call() 内部的整个操作都被 try catch 包围,因此如果我的操作内部发生任何异常,则会捕获并记录该异常。这一切都没有发生。该调用被调用并且永远不会返回,而下一个任务被一个一个调用并且永远不会返回并且永远不会完成并且永远不会抛出任何异常。
我怀疑我的任务导致线程池中的线程死亡。怎么可能模仿?
java - 在java中的某些条件下阻塞线程
也许这是一个非常愚蠢的问题,但请听我说完。我有一个用例,我收到许多并发请求来为特定的输入日期做某事。如果在同一输入日期收到两个并发请求,则后续请求不应继续,直到前一个请求完全完成(有充分理由)。使用标准 java.util.concurrent 组件来实现这一目标的最佳方法是什么?我最初的想法是拥有一个 LockFactory,它将出售锁并保留一份副本以表明它正在使用中,并且后续请求将在其上等待()。然而,这似乎有很多样板代码 - 有什么更简单的技巧让我难以捉摸吗?
提前致谢!
java - 如何使用 AtomicBoolean 阻塞和等待
我正在寻找一种暂停线程的方法。
我从有效地使用布尔标志(称为“暂停”)开始,并使用 while 循环(暂停)包装检查。
在while循环中有一个Thread.wait()
阻止执行。
我一直在看AtomicBoolean,除了它不会阻塞之外,它似乎可以解决问题。
是否有具有块方法的 AtomicBoolean 的替代或扩展版本?
AtomicBoolean.getFalse()
即类似的东西AtomoicBoolean.get(false)
?
他们有一个阻塞队列,所以有一个阻塞值。
当前设置是:
和
java - Condition类的await方法不抛出InterruptedException
我对 Java SE 6 中 Condition 类的 await 方法有一个奇怪的问题。问题是 await 方法在被另一个线程中断时并不总是抛出异常。
在文档中写道,在以下情况下会抛出 IE:
... 其他一些线程中断当前线程,支持中断线程挂起...
如何解释这个子句:“并且支持线程挂起的中断”
不抛出异常似乎是不可能的。你有过类似的问题吗?
java - java.util.concurrent.Future 线程安全吗?
我正在尝试查找说明 java.util.concurrent.Future 是否是/不是线程安全的文档。例如,我可以安全地将同一个 Future 实例提供给多个线程,这些线程都将调用 Future.get(...)?
我已经以这种方式使用 Future 测试了代码,它似乎工作正常,但如果我能找到书面的期望,即未来以这种方式并发访问是安全的,我会更高兴。
谢谢。