例如,如果我使用双核处理器并不使用线程编写java程序。这是否意味着程序执行是顺序并且它只会在双核中使用单核?
<小时/>例如,如果我使用双核处理器并使用线程和同步编写java程序。这是否意味着程序执行是并行并且它将使用所有可用的核心(在本例中是两个核心)?
如果我的推理完全错误,那么线程、核心和并行性之间的关系是什么?
最佳答案
首先,JVM 有许多后台线程,即使用户代码从不派生另一个线程,这些线程也会使用多个 CPU 和内核。例如,如果可能的话,垃圾收集器将在另一个 CPU 中同时运行,而不管用户代码如何。
如果您的用户代码从不派生另一个线程,则 JVM 永远不会在多个 CPU 中同时运行您的代码。如果您确实使用多个线程编写程序,则不能保证它将在多个 CPU 中运行,但肯定更有可能。这在很大程度上取决于操作系统上正在运行的其他内容以及线程的阻塞程度。如果您的线程消耗大量 CPU 周期并在现代操作系统上运行任意时间,那么是的,您的程序将使用两个 CPU。
您可以在 Linux 操作系统(和其他 Unixen)上验证这一点,方法是观察您的进程是否在任何时候消耗超过 100% 的 CPU。您还可以使用 ps
选项来显示底层线程及其 CPU 使用情况。在这里查看我的答案:Concurrency of posix threads in multiprocessor machine
关于java - 需要澄清并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13263409/