问题标签 [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.

0 投票
8 回答
73312 浏览

java - 如何为可调用线程命名?

我正在使用 ExecutorService 线程池执行一个可调用对象。我想给这个线程起个名字。

更具体地说,在旧版本中我这样做了 -

我在 log4j 日志记录中使用线程名称,这对故障排除有很大帮助。现在我正在将我的代码从 Java 1.4 迁移到 Java 1.6。我已经写了这个(如下所示) - 但我不知道如何给这个线程命名。

请给我一些想法来给这个线程命名?

0 投票
6 回答
3636 浏览

java - Java 线程池的使用

我正在尝试编写一个多线程网络爬虫。

我的主要入口类具有以下代码:

URLCrawler 获取指定的 URL,解析 HTML,从中提取链接,并将不可见的链接安排回前沿。

边界是未抓取的 URL 队列。问题是如何编写 get() 方法。如果队列为空,它应该等到任何 URLCrawler 完成,然后重试。仅当队列为空且当前没有活动的 URLCrawler 时,它才应返回 null。

我的第一个想法是使用 AtomicInteger 来计算当前工作 URLCrawler 的数量,并使用辅助对象进行 notifyAll()/wait() 调用。每个爬虫在开始时增加当前工作的 URLCrawler 的数量,在退出时减少它,并通知对象它已经完成。

但我读到 notify()/notifyAll() 和 wait() 是一些不推荐使用的线程通信方法。

我应该在这种工​​作模式中使用什么?它类似于M个生产者和N个消费者,问题是如何处理生产者的消耗。

0 投票
4 回答
9787 浏览

java - ConcurrentHashMap 有什么缺点吗?

我需要一个可从多个线程访问的 HashMap。

有两个简单的选项,使用普通的 HashMap 并在其上同步或使用 ConcurrentHashMap。

由于 ConcurrentHashMap 不会阻止读取操作,它似乎更适合我的需求(几乎完全读取,几乎从不更新)。另一方面,无论如何,我希望并发性非常低,所以不应该有阻塞(只是管理锁的成本)。

地图也将非常小(少于十个条目),如果这有所作为的话。

与常规的 HashMap 相比,读写操作的成本要高多少(我假设它们是)?或者,无论读取/更新比率和大小如何,即使可能存在中等级别的并发访问,ConcurrentHashMap 是否总是更好?

0 投票
1 回答
2482 浏览

java - 无法获取信号量的线程会发生什么?

当线程无法获取信号量(由于缺少许可)时会发生什么。会不会进入等待状态?

编辑:当信号量可用时,线程是否会开始恢复先前的执行序列。

0 投票
2 回答
1642 浏览

java - 使用 java.util.concurrent 类时是否应该同步以避免可见性问题?

使用任何 java.util.concurrent 类时,我是否仍需要同步对实例的访问以避免不同线程之间的可见性问题?

更详细地阐述这个问题

当使用 java.util.concurrent 的实例时,一个线程是否有可能修改该实例(即,将一个元素放入并发 hashmap 中)而后续线程不会看到修改?

我的问题源于这样一个事实,即如果对值的访问不同步,Java 内存模型允许线程缓存值而不是直接从内存中获取它们。

0 投票
1 回答
1995 浏览

java - Guava MapMaker().weakKeys().makeMap() vs WeakHashMap

我们有一个 Scala 服务器,它通过套接字使用协议缓冲区获取节点树,我们需要将附加数据附加到每个节点。

在单线程上下文中并且当节点树和关联数据都将同时删除其强引用时(由于超出范围),是否有任何理由使用 Google Guava 的 MapMaker 和 weakKeys() 而不是使用 Wea​​kHashMap ? 似乎使用 MapMaker,需要为同步访问付费,在这种情况下不需要。

顺便说一句,如果 MapMaker 提供对等价设置的访问权限,这样人们就可以选择引用相等而不关心弱引用或软引用,这将是有用的。

0 投票
10 回答
172094 浏览

java - 同步与锁定

java.util.concurrentAPI 提供了一个名为 as 的类Lock,它基本上会序列化控件以访问关键资源。它给出了 和 等park()方法unpark()

如果我们可以使用synchronized关键字和使用wait()方法,我们可以做类似的事情notify() notifyAll()

我想知道其中哪一个在实践中更好,为什么?

0 投票
3 回答
23995 浏览

java - 为什么 Java Future.get(timeout) 不可靠?

Future.get(timeout) 在给定超时后不会可靠地抛出 TimeoutException。这是正常行为还是我可以做些什么来使它更可靠?这个测试在我的机器上失败了。但是,如果我睡 3000 而不是 2000,它就会过去。

}

0 投票
6 回答
4201 浏览

java - Java中的并行性

有没有像 Java 中的 Intel TBB 这样支持并行的库。

0 投票
2 回答
5298 浏览

java - 单线程任务而不排队进一步的请求

我需要异步执行任务,同时丢弃任何进一步的请求,直到任务完成。

同步该方法只是将任务排队并且不会跳过。我最初想使用 SingleThreadExecutor 但也将任务排队。然后我查看了 ThreadPoolExecutor,但它读取队列以获取要执行的任务,因此将执行一项任务,并且至少有一项任务排队(其他任务可以使用 ThreadPoolExecutor.DiscardPolicy 丢弃)。

我唯一能想到的就是使用信号量来阻塞队列。我提供了以下示例来展示我想要实现的目标。有没有更简单的方法?我错过了什么明显的东西吗?

样本输出

采用 axtavt 的答案并转换上面的示例给出了以下更简单的解决方案。