多线程是真正同时运行还是内联运行(一个接一个)

时间:2016-08-17 19:25:22

标签: java multithreading

我确信MultiThreading的基本术语对我来说很清楚 - 一个进程由多个线程组成,可以同时运行它们,对吗?

我遇到了site,声明:

  

一次只能运行一个线程。

     

线程调度程序主要使用抢占式或时间切片调度   安排线程。

所以写作时实际发生了什么:

public static void main (String [] args) {
    new CalcThread("CalcThread A").start();
    new CalcThread("CalcThread B").start();
}

假设线程调度程序选择thread a先运行,让我们说thread b将在它之后安排。 thread b仅在thread a终止后才会运行吗?

如果是这种情况 - 为什么称它为并发行为?

2 个答案:

答案 0 :(得分:5)

调用start() 调度要执行的线程。虽然它通常“很快”执行,但实际执行开始时间是非决定性的;这取决于JVM。

在多核机器上,其他线程将(可能)在主线程继续的同时在其他核心上并发执行。

在单核机器(例如低规格AWS机器)上,JVM可以在继续主线程之前依次启动 - 处理 - 终止每个线程(我已经看到了这种情况)。

答案 1 :(得分:0)

这不一定是第一个正在运行的线程终止(完成所有工作),而是当它的时间量到期或者你在帖子中给出的其他因素时。

通过抢占式调度,可以停止正在运行的线程以支持更高优先级的线程,或者当新线程进入时,预期根据历史数据完成最短的时间。线程调度和用于执行此操作的算法可以考虑许多因素。

是的,它们同时运行,因为它们可以同时取得进展,但不能并行(实际上是在同一时间做同事)。