Java是否自动访问所有线程?

时间:2015-04-16 20:08:15

标签: java multithreading

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

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

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

我的程序是否会使用所有CPU线程而不告诉它这样做?

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

这是我的活动监视器:

enter image description here

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

因此,必须访问所有线程。这是正确的吗?这是否意味着我没有理由在我编写的代码中实现线程?

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

  

我的程序是否会使用所有CPU线程而不告诉它这样做?

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

答案 2 :(得分:0)

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

  

我的程序是否会使用所有CPU线程而不告诉它这样做?

不,您的程序将只使用所需数量的线程。它(在正常情况下)也无法访问属于其他进程的线程,所以即使你的CPU正在盯着它,它也不仅仅是教授分配时间片而不是java占用一堆线程。

More info on time slicing and preemptive multitasking.

答案 3 :(得分:0)

从写问题的方式来看,似乎存在对单词" thread"的基本误解。和" CPU" (或者更确切地说," CPU核心")。其他答案和进一步的资源可能有助于澄清这一点。

<子> 除此之外,这些&#34;活动监测&#34;通常不是衡量事物最准确的方法。


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

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


另一个可能的原因可能是&#34;隐藏&#34;并行性不是由显式用户线程引起的。在任何情况下,您都不必显式创建一个new Thread(...)的线程。例如,新的Java 8流API可以使用提供的并行线程的多个线程(因此,在多个核上施加负载)。但是从这个问题来看,这似乎不太可能。