对并发和Java线程感到困惑

对并发和Java线程感到困惑,java,multithreading,concurrency,cpu,java-threads,Java,Multithreading,Concurrency,Cpu,Java Threads,在阅读了Java线程的并发性之后,我有点困惑。有些人声称(他们可能错了)Java线程是并发执行的 如果您有4个CPU可以执行多线程(可以处理8个线程),那么当您在Java代码中创建30个线程时,这些线程怎么可能同时执行?据我所知,目前只有4个线程可以并发运行,其他4个线程正在等待执行,22个线程在队列池中。是我遗漏了什么,还是我理解的术语同时错了?很简单-在您的场景中,启动了30个线程,但在同一时间(在给定的时刻)只执行了4个线程。螺纹一件一件地加工。任何线程的片段都可以执行,但在给定时间只能执

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


如果您有4个CPU可以执行多线程(可以处理8个线程),那么当您在Java代码中创建30个线程时,这些线程怎么可能同时执行?据我所知,目前只有4个线程可以并发运行,其他4个线程正在等待执行,22个线程在队列池中。是我遗漏了什么,还是我理解的术语同时错了?

很简单-在您的场景中,启动了30个线程,但在同一时间(在给定的时刻)只执行了4个线程。螺纹一件一件地加工。任何线程的片段都可以执行,但在给定时间只能执行4个

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


操作系统和JVM中的线程也会发生同样的情况。

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

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


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

“并发”并不意味着所有进程都在同一时刻运行。这只意味着在它们停止之前,所有的一切都已经开始了。操作系统以足够高的速率将每个处理器从一个线程切换到另一个线程,从而产生它们都并行运行的错觉。一些人声称(他们可能错了)Java线程是并行执行的,这就是线程的意义所在,不是吗?如果一个给定的程序的线程数超过了计算机平台的物理处理能力,那么线程开始争夺可用资源,就这么简单。虚拟机和/或操作系统将为每个线程提供一定的执行时间,否则将暂停并等待。您可以通过为线程分配优先级来在一定程度上影响这一点,但最终这超出了您的控制范围,并且受操作系统(更多)和虚拟机(更少)的控制。如果您的CPU可以处理8个线程,那么8个线程可以并行运行(实际上是同时进行),但任何数量的线程都可以并发运行(被操作系统不断地安排进进出出)。我写这篇文章,同时看电视:-)实际上,我的注意力在来回转移。