【发布时间】:2013-07-23 08:54:49
【问题描述】:
我的 Java 程序使用 java.util.concurrent.Executor 来运行多个线程,每个线程都启动一个可运行的类,在该类中它从 C: 驱动器上的逗号分隔文本文件中读取并循环遍历行以拆分和解析将文本转换为浮点数,然后将数据存储到:
static Vector
static ConcurrentSkipListMap
我的电脑是 Win 7 64bit,Intel Core i7,有 6 * 2 核心和 24GB 内存,我注意到程序将运行 2 分钟并完成所有 1700 个文件,但 CPU 使用率只有 10% 左右到 15%,无论我分配多少线程:
Executor executor=Executors.newFixedThreadPool(50);
Executors.newFixedThreadPool(500) 不会有更好的 CPU 使用率或更短的时间来完成任务。没有网络流量,一切都在本地 C: 驱动器上,有足够的内存供更多线程使用,当我将线程增加到 1000 时,它会出现“OutOfMemoryError”。
为什么更多的线程不能转化为更多的 CPU 使用率和更少的处理时间,为什么?
编辑:我的硬盘是 SSD 200 GB。
编辑:终于发现问题出在哪里,每个线程将其结果写入一个由所有线程共享的日志文件,我运行应用程序的次数越多,日志文件越大,它变得越慢,因为它是共享,这肯定会减慢进程,所以在我停止写入日志文件后,它会在 10 秒内完成所有任务!
【问题讨论】:
-
更多线程不会让你的磁盘更快。
-
谷歌一些图形CPU时间分析器,并检查CPU在“IO等待”状态下花费了多少时间。这受磁盘(和其他资源)延迟的影响。仅供参考,一个好的 SSD 磁盘可以将 IO 等待减少到几乎为零。
-
你的线程有同步吗?
-
同步由 Executor 处理,不是吗?我没有其他事情要做。
-
如果您的线程访问相同或某些相同的对象,您可能只会进行同步。这可能以使用具有内部同步的对象的形式出现(例如
Vector或ConcurrentSkipListMap,您正在使用)或通过synchronized。多个线程是否访问相同的Vector或ConcurrentSkipListMap?
标签: java multithreading cpu-usage