对并发和Java线程感到困惑

时间:2019-01-18 15:04:02

标签: java multithreading concurrency cpu java-threads

在阅读了有关Java线程的并发性之后,我有些困惑。有些人声称(它们可能是错误的)Java线程是同时执行的?

如果您有4个CPU可以执行多线程(可以处理8个线程),那么当您在Java代码中创建30个线程时,又如何同时执行这些线程,又怎么可能呢?据我所知,目前只能同时运行4个线程,其他4个线程正在等待执行,而22个线程在队列池中。我是否遗漏了某些东西,或者我同时理解该术语错误?

2 个答案:

答案 0 :(得分:0)

这很简单-在您的方案中,启动了30个线程,但只有4个线程同时(在给定的瞬间)执行。线程是逐段执行的。任何线程中的片段都可以执行,但在给定时间只能执行4个片段。

如果您有2个施工团队(核心)一次要建造10个房屋(线程),但是每个房屋每天仅由一个团队建造4个小时(线程调度),您仍然会说10房屋是同时建造的,但不一定要在同一时间建造(因为只有2座房屋将在同一时刻建造)。

OS和JVM中的线程也是如此。

答案 1 :(得分:0)

您拥有的所有线程将并发运行,只要它们没有被阻塞等待彼此或等待某些I / O。他们不会等待对方终止(除非您通过有限大小的线程池或可完成的期货进行编程)。

现在,并发的级别和性能将由您拥有的硬件(内核越多越好)和底层操作系统的线程调度机制决定。

请记住,与您的程序并行,您的操作系统还将具有其他进程(每个进程也占用cpu时间)。进程和线程之间的并发机制相似(只要它们不是用户级线程)。操作系统将在适当的时候进行上下文切换。您不应在程序中注意到这一点(除非其他进程确实占用大量CPU)。