有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程Java会自动访问所有线程吗?

我对Java中的多线程不是很了解。但在网上进行了短暂的搜索后,我看到人们创建了实现Thread类的类,并启动了这些新的Thread对象,或者类似的东西。我还看到了一个更高级别的并发库

目前,我已经编写了一个非常简单的程序,并且在运行时完全没有针对多线程处理器进行优化

然而,当我从终端运行程序并检查我的活动监视器(任务管理器)时,我注意到100%的CPU正在使用。因此,必须访问所有线程。是这样吗?这是否意味着没有理由在我编写的代码中实现线程

我的程序会使用所有CPU线程而不让我这么做吗

我记得几个月前编写过一个C++程序,但事实并非如此。它显示了我运行的每个程序50%的CPU使用率

这是我的活动监视器:

enter image description here


共 (4) 个答案

  1. # 1 楼答案

    Hence, all threads must are being accessed. Is this right? Does this mean there is no reason to implement threading in the code I write?

    java程序需要一个线程才能运行——对于通过main方法启动的程序,这是JRE启动的主线程。如果所有的计算都在这个方法中,那么它是在一个线程上运行的(理论上是在一个CPU上)。如果进程/计算可以并行化,有理由这样做,并且有足够的CPU可用,那么启动更多线程可以加快进程(相对于CPU的数量而言,在合理范围内)

    Will my program use all CPU threads without me telling it to do so?

    操作系统将分配给CPU。也就是说,线程是一个串行计算。。。这意味着它不能同时分配给两个CPU。因此,在2个CPU的计算机上运行单个java线程(不睡眠或等待)应该会导致应用程序的CPU总使用率达到50%(在4个CPU上,这将下降到25%,以此类推……)

  2. # 2 楼答案

    不,Java不会自动使用多线程。 如果要在多个线程之间拆分负载,必须创建Thread或Runnable类的实例,或者使用一些框架或库来完成

  3. # 3 楼答案

    从问题的编写方式来看,似乎对“线程”和“CPU”(或者更确切地说是“CPU核心”)这两个词有一个基本的误解。其他答案和更多资源可能有助于澄清这一点

    除此之外,这些“活动监视器”通常不是测量事物的最精确方法。


    但实际问题的答案是:是的:即使是一个(看似)单线程Java程序也可以使用多个内核,并导致如此高的负载

    这里最可能的情况是:垃圾收集。有并行垃圾收集器(有关详细信息,请参见Hotspot VM Options)。如果您的程序产生大量垃圾,或者堆大小太小,导致垃圾收集器非常努力地工作以防止OutOfMemoryError,那么这可以解释多个内核上的高工作负载


    另一个可能的原因可能是非显式用户线程导致的“隐藏”并行性。您不必在任何情况下都显式地创建带有new Thread(...)的线程。例如,新的Java 8 streams API可能会使用多个线程(从而对多个内核施加负载)和提供的并行线程。但从问题来看,这似乎不太可能

  4. # 4 楼答案

    我不太确定你在问什么,所以我会尽力回答

    Will my program use all CPU threads without me telling it to do so?

    不,您的程序将只使用所需的线程数。它(在正常情况下)也无法访问属于其他进程的线程,因此,即使你的CPU将其固定在教授分配时间片的方式上,也比java占用大量线程的方式更重要

    More info on time slicing and preemptive multitasking.