当前位置: 首页 > 知识库问答 >
问题:

Java中的多线程-异步行为

夏令秋
2023-03-14

我正在使用multithreading来处理通过文件的大量记录。每一行都是一条记录,我将每一行传递给单独的线程进行处理,问题是我必须收集这些处理过的记录以及在处理记录时生成的更多数据,然后在最后的数据收集上应用一些业务逻辑。我将一个通用的concurrenthashmap传递给所有线程来填充已处理的数据,当我通过visualVM调试它时,我发现(屏幕截图如下)这些线程在等待中花费的时间比在运行中花费的时间多。我想这是因为一个线程在写入concurrenthashMap时获得了锁。

有没有一种方法可以实现完全的异步行为来实现我的目标?

visualVM snapshot

共有1个答案

钱和平
2023-03-14

我发现这些线程在等待中花费的时间比在运行中花费的时间多。我想这是因为一个线程在写入ConcurrentHashMap时获得了锁。

这不是一个好的假设-ConcurrentHashMap非常高效,并且设计成可以并发使用。即使它确实有一些争议,它也不是我在这种情况下首先要看的地方。

这些线程还在做什么工作?I/O是一个阻塞操作(如果读/写到同一个磁盘,则是同步的),如果多个线程正在执行I/O操作,那么它对吞吐量的影响将比concurrenthashmap争用大几个数量级。

 类似资料:
  • 我创建了一个多线程步骤,最大线程限制为10; 在处理了200万条记录文件后,我可以在日志文件中看到创建的线程太多,即使我将限制设置为10个线程。你能告诉我为什么吗?非常感谢。 2019-07-02T17:02:298968129857信息[batch-thread35348]com。db。wmdl。价格档案。工作一批听众。PriceFileReaderListener([])-PriceFileR

  • [1]“多线程和异步编程的区别”

  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?

  • 我有一个spring boot微服务,我们在其中调用多个服务(比如服务a和服务B)。我试图根据某些条件在多个线程上异步调用这两个服务,一旦处理完成,我想合并服务A和服务B的响应。 我知道我们可以使用@Async异步运行一个进程,并使用ExecutorService为一个服务启动多个线程。 但是我不确定如何把所有的东西放在一起。所以在这里寻找任何建议? 我知道这在上面主要是理论上解释的,但我尝试了跟

  • 问题内容: 我发现在Python 3.4中,用于多处理/线程的库很少:多处理vs线程与asyncio。 但是我不知道使用哪个,或者是“推荐的”。他们做的是同一件事还是不同?如果是这样,则将哪一个用于什么?我想编写一个在计算机上使用多核的程序。但是我不知道我应该学习哪个图书馆。 问题答案: 它们旨在(略有)不同的目的和/或要求。CPython(典型的主线Python实现)仍然具有全局解释器锁,因此多

  • 但我不知道该用哪一个或是“推荐的”。他们做的是相同的事情,还是不同?如果是,哪一个用于什么?我想写一个在我的计算机中使用多核的程序。但我不知道我应该去哪个图书馆。