例如,如果我使用双核处理器并在不使用线程的情况下编写 java 程序。这是否意味着程序执行是顺序的,并且它只会在双核中使用单核?
例如,如果我使用双核处理器并使用线程和同步编写 java 程序 。这是否意味着程序执行是并行的并且它将使用所有可用的内核(在这种情况下是两个内核)?
如果我的推理完全错误,那么线程,核心和并行性之间的关系是什么?
例如,如果我使用双核处理器并在不使用线程的情况下编写 java 程序。这是否意味着程序执行是顺序的,并且它只会在双核中使用单核?
例如,如果我使用双核处理器并使用线程和同步编写 java 程序 。这是否意味着程序执行是并行的并且它将使用所有可用的内核(在这种情况下是两个内核)?
如果我的推理完全错误,那么线程,核心和并行性之间的关系是什么?
首先,JVM 有许多后台线程,它们将使用多个 CPU 和内核,即使用户代码从未分叉另一个线程。例如,如果可能,垃圾收集器将在另一个 CPU 中同时运行,而不管用户代码如何。
如果您的用户代码从不分叉另一个线程,则 JVM 将永远不会在多个 CPU 中同时运行您的代码。如果您确实使用多个线程编写程序,则无法保证它将在多个 CPU 中运行,但肯定更有可能。这在很大程度上取决于操作系统上运行的其他内容以及线程的阻塞程度。如果您的线程消耗大量 CPU 周期并在现代操作系统上运行任意时间长度,那么是的,您的程序将同时使用两个 CPU。
您可以在 Linux 操作系统(和其他 Unixen)上通过观察您的进程是否在任何时候消耗超过 100% 的 CPU 来验证这一点。您还可以使用ps
选项来显示底层线程及其 CPU 使用率。在这里查看我的答案:多处理器机器中 posix 线程的并发性