- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
任务是 - 需要通过一些 CPU 密集型操作来处理多个 I/O 流(HTTP 下载)。理想情况下希望拥有完整的带宽和 100% 的 CPU 使用率。当然 - 繁重的 CPU 处理速度比互联网下载慢。未处理的数据可以缓存到磁盘上。 ASF 或其他组件中是否有现有的 Executor 提供此功能?如果不是 - 实现这一目标的最佳方法是什么?考虑有 2 个线程池,一个用于 Internet-To-Disk
操作,另一个用于 Disk-To-CPU-To-Disk
操作。
编辑:
我会澄清我的问题:
2 个线程池:Internet-To-Disk
和 Disk-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/
我是一名优秀的程序员,十分优秀!