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

时间:2013-10-06 10:47:11

标签: java multithreading parallel-processing

到目前为止,我的印象是同时启动的2个线程也是并行执行的(两个代码同时运行),但我最近阅读了一些文档,我明白他们实际上是打开代码的执行,因此第一个线程的代码片段与第二个线程中的一段代码同时执行。 我的理解是否正确?

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

5 个答案:

答案 0 :(得分:8)

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

b)如果你的线程在等待IO等时调用Thread.sleep(),它会使资源可用于其他线程。因此,在处理外部资源时,多线程应用程序实际上比单线程应用程序更快

答案 1 :(得分:3)

如果有足够的足够的CPU 可用于JVM,则Java线程并行执行。您不能同时在具有单个计算元素的计算机上运行2次计算,因此该计算元素可以在任何给定时间首先使用,也可以通过第二次计算使用。你读过的可能与这种情况有关。

答案 2 :(得分:2)

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

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

修改
当您只有一个CPU时,多线程仍然是有益的。例如,您可以让一个线程从磁盘读取图像,而另一个线程调整图像大小。这也将提高性能,因为您可以无浪费地使用CPU。

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

答案 3 :(得分:1)

你问题的答案取决于系统的CPU数量。 请记住,单个CPU一次只能处理一个线程,但线程之间的上下文切换速度很快,似乎线程并发运行。

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


在旁注中,如果您想查看一些基本的多线程教程http://javasolutionsonline.blogspot.in/p/java-concurrency.html

,请浏览此博客页面。

答案 4 :(得分:-1)

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

线程也提供了许多其他优点,因为您必须已经知道