Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程实际上是并行处理还是只是一种错觉?_Java_Multithreading - Fatal编程技术网

Java 多线程实际上是并行处理还是只是一种错觉?

Java 多线程实际上是并行处理还是只是一种错觉?,java,multithreading,Java,Multithreading,假设有10个不相交且独立的任务。如果单线程执行需要10分钟,每个任务需要1分钟,那么10个线程,每个任务一个线程会在1分钟内完成执行吗 因为一次只能运行一条指令,并且假设CPU只运行这个进程。 多线程不是在线程之间快速切换上下文,给人一种并行处理的错觉,但实际上并不是在处理吗 那么,既然CPU要执行的指令数量是相同的,无论是单线程还是多线程,完成它不应该花费相同的时间吗? 如果是,那么多线程是并行处理的一种方式的说法不是错误的吗?是的,Java天生就是多线程的。一个Java程序可以有许多不同的线

假设有10个不相交且独立的任务。如果单线程执行需要10分钟,每个任务需要1分钟,那么10个线程,每个任务一个线程会在1分钟内完成执行吗


因为一次只能运行一条指令,并且假设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分钟内完成执行吗

可能是,可能不是。这取决于两件事:

  • 这些任务真的是不相交的吗?例如,如果它们涉及共享数据结构和同步,则它们不是不相交的

  • 是否有(至少)10个物理内核可用于运行10个线程

  • 它们的内存带宽是否足以满足10个线程对RAM的读/写瓶颈


  • 由于一次只能运行一条指令

    实际上,这在技术上是不正确的。即使只有一个内核,CPU也可以通过流水线同时执行多条指令

    但我们可以说,传统机器上的给定内核或超线程通常一次只执行一个指令流

    。。。假设CPU仅运行此进程

    我想你指的不是GPU1,一个只有一个内核的CPU,没有超线程

    即使是现在的低端笔记本电脑/台式机,这些都不是一个有效的假设

    多线程不是在线程之间快速切换上下文,给人一种并行处理的错觉,但实际上并不是在处理吗

    实际上,如果在一个内核上运行多个线程,那么线程之间的上下文切换需要很长时间(数百条h/w指令)。而且这种情况很少发生

    但如果假设只有一个核心/超线程,那么线程不能并行执行是正确的

    那么,既然CPU要执行的指令数量是相同的,无论是单线程还是多线程,完成它不应该花费相同的时间吗?如果是,说明多线程是并行处理的一种方法不是错误的吗

    如果您假设只有一个核心/超线程可用,那么您的结论是正确的。然而,这种假设在现代计算机上通常是不正确的

    例如,我3岁的戴尔笔记本电脑有一个CPU,每个CPU有2个内核和2个超线程,这可以使理论上的加速比(由于硬件并行性!!)提高4倍。(这并没有考虑使用GPU的可能性…)

    请注意,典型的服务器级机器每个刀片有2或4个CPU,可能更多。有些服务器级CPU的核数达到16核或更多。因此,一台计算机有64个核并不罕见



    1-普通Java不会将GPU用于一般计算,因此这有点像是在转移注意力。

    您似乎假设执行程序的计算机只有一个CPU核心。这