Java线程实际上并不是并行执行的?

问题描述 投票:0回答:6

到目前为止,我的印象是同时启动的 2 个线程也是并行执行的(都同时运行各自的代码),但我最近阅读了一些文档,我了解到它们实际上是轮流启动的它们的代码的执行,因此第一个线程的代码不会与第二个线程的代码同时执行。 我的理解正确吗?

如果是,那么多线程如何比单线程执行更快? 我问这个问题是因为唯一的区别是单个线程顺序执行代码,而多线程可以轮流执行,但仍然应该花费相同的时间,因为它没有并行完成

java multithreading parallel-processing
6个回答
9
投票

a) 在多处理器机器上,线程实际上可以并行运行(每个 CPU 一个)

b) 如果您的线程在等待 IO 等时调用

Thread.sleep()
,它会使资源可供其他线程使用。所以在处理外部资源时,多线程应用程序实际上比单线程应用程序更快


3
投票
如果有

足够的 CPU 可用于 JVM,则Java 线程会并行执行。您无法在具有单个计算元素的计算机上同时运行 2 个计算,因此该计算元素在任何给定时间要么由第一个计算使用,要么由第二个计算使用。也许您读到的内容与这种情况有关。


2
投票

不,Java 线程是并行执行的(与 CPython 等其他平台不同)。但是,这是否会提高性能取决于您执行的代码。

如果您使用易于并行和 CPU 密集型任务进行测试,例如使用可并行算法计算 PI 或调整大量图像的大小等,您可以轻松证明性能可以基本线性提高(如果您有 2 个 CPU = x2,4 个 CPU = x4等)

编辑
当你只有一个CPU时,多线程仍然是有益的。例如,您可以让一个线程从磁盘读取图像,而另一个线程调整图像大小。这也将提高性能,因为您可以充分利用 CPU,而不会浪费。

编辑2: 当您在单个线程中读取图像并调整图像大小(注意复数)时,您会发现 CPU 使用率不会始终为 100%。这是因为当线程从文件读取时,它无法执行调整大小。如果您有多个线程,则当调整大小完成时,另一个文件将在内存中准备就绪。如果您正在处理大图像,则通过此设计将 CPU 固定在 100% 相对容易。


1
投票

您问题的答案取决于系统拥有的 CPU 数量。 请记住,单个 CPU 一次只能处理一个线程,但线程之间的上下文切换非常快,以至于看起来线程正在同时运行。

关于你的第二个问题如果是,那么多线程如何比单线程执行更快? 多线程利用 CPU 周期。假设一个线程在某些资源上被阻塞,其他线程可能有机会运行。


顺便说一句,如果您想查看一些基本的多线程教程,请浏览此博客页面http://javasolutionsonline.blogspot.in/p/java-concurrency.html


0
投票

是的,如果您的系统具有多核 CPU,它们可以并行运行。 在传统系统上,单核 cpu 不会使线程并行运行。

线程基本上是轻量级进程,它在进程内执行顺序的任务流。


-1
投票

嗯..线程确实并行运行...但不是在具有单核的传统电脑中.. 如果你有一个多核芯片或多个CPU,那么它们可以并行运行。 想象一下每个四核上都运行一个线程......

线程还给您带来许多其他优势,您一定已经知道了

© www.soinside.com 2019 - 2024. All rights reserved.