Java线程是并发的还是并行的?

ff29svar  于 2023-02-07  发布在  Java
关注(0)|答案(3)|浏览(262)

所以我很困惑,我读到一篇文章说1.7版以上的java是"核心感知"的
现在的问题是,如果我使用Thread类,假设它是一个多核系统,任务完全不相交,并且假设只有这个进程在系统上运行,那么线程是并行还是并发的?
1.7版本之前的情况是什么?这是否意味着java在那时只是并发的?ForkJoinPool和ThreadPool(执行器框架)也是如此。

    • 并发:**不在同一时刻,按顺序在同一核心上,即,根据线程调度的要求。
    • 并行:**在不同内核上同时运行,例如8线程/4内核(超线程)。

先谢谢你了

e4yzc0pl

e4yzc0pl1#

并行 * 是 * 并发的。“并发”意味着两个或多个不同线程的事件发生的有效顺序是未定义的(不包括像解锁互斥锁这样专门用于协调线程的事件)。“并行”意味着线程使用的CPU资源比单个CPU内核所能提供的更多。线程不能并行运行,除非同时运行。
在1.7版本之前是什么情况
我不记得1.7有什么变化,但我从Java最早的时候就开始使用它了,这种语言总是承诺线程可以并发运行。线程是否也可以并行运行超出了语言规范的范围。这取决于您运行的硬件、操作系统和版本、JVM和版本等。

nnt7mjpx

nnt7mjpx2#

我认为"文章"所指的实际变化发生在Java 1.3中,当时"绿色线程"实现1被替换为"原生"线程。(来源:https://en.wikipedia.org/wiki/Green_thread
但是,您对并发与并行的区分与Oracle/Sun的定义不相符;参见Sun's Multithreaded Programming Guide: Defining Multithreading Terms
"并行性:当至少有两个线程同时执行时出现的一种情况。
"并发性:当至少有两个线程正在进行时存在的一种情况。一种更一般的并行形式,可以包括时间分片作为虚拟并行的一种形式。
这也符合Wikipedia page on Concurrency的说法。
在计算机科学中,并发是指程序、算法或问题的不同部分或单元无序或部分顺序执行而不影响结果的能力。这允许并行执行并发单元,从而显著提高多处理器和多核系统中的整体执行速度。
如果你能给我们一个你对"同时"和"平行"定义的来源的引文,这将有助于我们理解是否存在关于术语的真正争议...或者...你只是被误导了。
1-有趣的事实:他们被称为"绿色线程",因为开发第一个Java版本的Sun团队被称为"绿色团队"。2来源:作者:Jon Byous,2003年4月。

7gyucuyw

7gyucuyw3#

所以我很困惑,我读到一篇文章说1.7版以上的java是"核心感知"的
我认为上下文很重要。也许你说的是this Quora post?引用:
从Java7开始,JVM就可以感知内核,并且能够访问CPU中的内核。如果主机有两个CPU,每个CPU有两个内核,那么它可以创建四个线程,并将它们分配到四个内核中的每一个。
这不是在讨论并发理论或并行性之间的区别,而是JVM如何与OS和硬件接口,以便为应用程序提供线程服务。
在1.7版本之前是什么情况,这是否意味着java在那时只是并发的?
Java线程在1.7之前已经有一段时间了。大多数并发性的东西在1.5中得到了很大的改进。同样,这篇文章似乎是专门针对CPU和内核的。1.7之前的应用程序可以使用多个内核并行运行。
现在的问题是,如果我使用Thread类,假设它是一个多核系统,任务完全不相交,并且假设只有这个进程在系统上运行,那么线程是并行还是并发的?
所以这部分的问题似乎是针对学术术语"并行"和"并发"。@SolomonSlow听起来他们在这方面有更多的学术指导。我已经编程线程30多年了,从线程是非抢占式的时候开始,回到再入更多的是递归而不是线程的时候。
对我来说,"并发"意味着并行--在放置在不同内核(物理或虚拟)上的单个硬件上并发运行。
我还知道,线程程序可能会串行运行,这取决于许多因素,包括应用程序本身、操作系统、运行它的服务器上的负载等,这背后有很多理论。
并发:不在同一时刻,按顺序在同一核心上,即,根据线程调度的要求。
我不同意这个定义,维基百科页面提到了两个并发单元可以并行运行或者无序运行,这意味着顺序运行,但这不是定义的一部分。

相关问题