对并发和 Java 线程感到困惑

Confused about concurrency and Java threads

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

如果你有 4 个 CPU 可以执行多线程(可以处理 8 个线程),当你在你的 Java 代码中创建 30 个线程时,怎么可能这些都被执行同时(同时)?到目前为止,我知道只有 4 个可以 运行 并发,其他 4 个线程正在等待执行,22 个在队列池中。我是不是遗漏了什么,或者我对concurrently这个词的理解有误?

很简单 - 在您的场景中启动了 30 个线程,但同时(在给定的瞬间)仅执行了其中的 4 个。线程一点一点地执行。可以执行来自任何线程的片段,但在给定时间只能执行 4 个。

如果你有 2 个建筑团队(核心)一次建造 10 个房子(线程),但每个房子每天只由一个团队建造 4 小时(线程调度),你仍然会说10 栋房屋同时建造,但不一定完全同时建造(因为其中只有 2 座房屋将在同一时刻建造)。

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

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

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

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