Java 多线程实际上是并行处理还是只是一种错觉?
假设有10个不相交且独立的任务。如果单线程执行需要10分钟,每个任务需要1分钟,那么10个线程,每个任务一个线程会在1分钟内完成执行吗Java 多线程实际上是并行处理还是只是一种错觉?,java,multithreading,Java,Multithreading,假设有10个不相交且独立的任务。如果单线程执行需要10分钟,每个任务需要1分钟,那么10个线程,每个任务一个线程会在1分钟内完成执行吗 因为一次只能运行一条指令,并且假设CPU只运行这个进程。 多线程不是在线程之间快速切换上下文,给人一种并行处理的错觉,但实际上并不是在处理吗 那么,既然CPU要执行的指令数量是相同的,无论是单线程还是多线程,完成它不应该花费相同的时间吗? 如果是,那么多线程是并行处理的一种方式的说法不是错误的吗?是的,Java天生就是多线程的。一个Java程序可以有许多不同的线
因为一次只能运行一条指令,并且假设CPU只运行这个进程。 多线程不是在线程之间快速切换上下文,给人一种并行处理的错觉,但实际上并不是在处理吗 那么,既然CPU要执行的指令数量是相同的,无论是单线程还是多线程,完成它不应该花费相同的时间吗?
如果是,那么多线程是并行处理的一种方式的说法不是错误的吗?是的,Java天生就是多线程的。一个Java程序可以有许多不同的线程独立地、连续地执行。同一页面上的三个Java小程序可以一起运行,每个程序都可以从CPU获得相等的时间,程序员只需付出很少的额外努力 这使得Java对用户输入非常敏感。它还有助于增强Java的健壮性,并提供一种机制,使Java环境能够确保恶意小程序不会窃取主机的所有CPU周期 不幸的是,多线程与Java紧密集成,这使得Java很难移植到Windows 3.1或PowerMac等本机不支持抢占式多线程的体系结构
多线程带来了成本。多线程对于Java就像指针算法对于C一样,是一个极难发现的bug源。尽管如此,在简单的程序中,可以不使用多线程,并且通常是正常的您的解释假设使用单CPU系统。即使在这种情况下,假设所有线程都属于同一进程也是一个错误 假设两个进程同时运行。第一个进程具有长阻塞操作(即i/O、磁盘访问)。当CPU等待此操作完成时,如果没有多线程,它将不得不等待空闲。但是,多线程支持上下文切换,并支持sopisticated调度算法,从而最大限度地利用CPU
我上面提到的示例可以应用于具有多线程的单个进程。一个执行阻塞操作,另一个不执行。如果系统有多个CPU,或者每个CPU有多个内核,JVM可以利用这些资源并并行运行线程。您可以获得实际并行处理速度优势 可用CPU内核的数量是多线程代码并行处理速度优势的上限。由于开销和其他低效率,使用4核系统的速度不可能达到整整4倍,但您可以使用经过精心设计的代码来利用并行处理。Java多线程通常提供真正的并行性。。。不仅仅是一种平行的错觉 假设有10个不相交且独立的任务。如果单线程执行需要10分钟,每个任务需要1分钟,那么10个线程,每个任务一个线程会在1分钟内完成执行吗 可能是,可能不是。这取决于两件事:
由于一次只能运行一条指令 实际上,这在技术上是不正确的。即使只有一个内核,CPU也可以通过流水线同时执行多条指令 但我们可以说,传统机器上的给定内核或超线程通常一次只执行一个指令流 。。。假设CPU仅运行此进程 我想你指的不是GPU1,一个只有一个内核的CPU,没有超线程 即使是现在的低端笔记本电脑/台式机,这些都不是一个有效的假设 多线程不是在线程之间快速切换上下文,给人一种并行处理的错觉,但实际上并不是在处理吗 实际上,如果在一个内核上运行多个线程,那么线程之间的上下文切换需要很长时间(数百条h/w指令)。而且这种情况很少发生 但如果假设只有一个核心/超线程,那么线程不能并行执行是正确的 那么,既然CPU要执行的指令数量是相同的,无论是单线程还是多线程,完成它不应该花费相同的时间吗?如果是,说明多线程是并行处理的一种方法不是错误的吗 如果您假设只有一个核心/超线程可用,那么您的结论是正确的。然而,这种假设在现代计算机上通常是不正确的 例如,我3岁的戴尔笔记本电脑有一个CPU,每个CPU有2个内核和2个超线程,这可以使理论上的加速比(由于硬件并行性!!)提高4倍。(这并没有考虑使用GPU的可能性…) 请注意,典型的服务器级机器每个刀片有2或4个CPU,可能更多。有些服务器级CPU的核数达到16核或更多。因此,一台计算机有64个核并不罕见
1-普通Java不会将GPU用于一般计算,因此这有点像是在转移注意力。您似乎假设执行程序的计算机只有一个CPU核心。这