针对 I/O 密集型和 CPU 密集型操作的 Java 线程同步

标签 java multithreading synchronization

任务是 - 需要通过一些 CPU 密集型操作来处理多个 I/O 流(HTTP 下载)。理想情况下希望拥有完整的带宽和 100% 的 CPU 使用率。当然 - 繁重的 CPU 处理速度比互联网下载慢。未处理的数据可以缓存到磁盘上。 ASF 或其他组件中是否有现有的 Executor 提供此功能?如果不是 - 实现这一目标的最佳方法是什么?考虑有 2 个线程池,一个用于 Internet-To-Disk 操作,另一个用于 Disk-To-CPU-To-Disk 操作。

编辑:

我会澄清我的问题:

2 个线程池:Internet-To-DiskDisk-To-CPU-To-Disk 本身就是生产者/消费者方法。问题是如何确保我为生产者和消费者选择了正确数量的线程?相同的代码将同时在具有不同核心数量和不同带宽的不同盒子、架构上运行。如何确保我选择了正确的线程数,以便消耗 100% 的带宽和 100% 的 CPU?

最佳答案

假设 CPU 处理将成为系统的主要瓶颈,则用于 CPU 处理的线程数至少应设置为可用的 CPU 或内核数。

I/O 部分可能根本不会使用太多 CPU,但您可能需要分配一个固定的少量线程池(等于或小于核心数量),以防止同时 I/O 流发生过多的线程上下文切换。

如果您的 CPU 处理线程从开始到结束并不总是使用 100% 的 CPU,您还可以将用于 CPU 处理的线程数设置为略大于核心数的数字。例如,如果他们可能在处理过程中执行一些 I/O 或访问某些共享资源。

但与任何系统一样,理想的线程数量在很大程度上取决于程序的性质。您可以使用 JVisual VM(与 JDK 捆绑在一起)等工具来分析程序中如何利用线程,并尝试不同的线程设置变化。

关于针对 I/O 密集型和 CPU 密集型操作的 Java 线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470594/

相关文章:

java - 如何在eclipse中设置sqoop2应用程序项目?

java - 如何为具有 Java Spring 安全性的用户授予权限

matlab - 能同步Matlab的数据采集工具箱和图像采集工具箱吗?

synchronization - Vulkan 中统一缓冲区的最佳实践

java - Java 中的生产者/消费者。为什么我们需要两个条件?

java - 如何使用 selenium WebDriver 查找文本字段的元素?

c# - .NET Volatile.读/写和互锁范围

java - 使用 Java 线程的简单交通灯模拟

python - python中的多进程会重新初始化全局变量吗?

java - 编译时的通用重载