当线程执行时,CPU内部到底发生了什么?

时间:2018-11-24 01:56:53

标签: java multithreading thread-sleep

我认为我在考虑Java中线程的概念,这可能是一个愚蠢的问题。我在线程上读了一些已回答的主题,但实际上并没有回答我的问题。

因此,假设我们有3个线程:t1,t2,t3。

t1的运行方法:

thread.sleep(1000);
System.out.println("Hello");

t2的运行方法:

System.out.println("Hi");

t3的运行方法:

thread.sleep(3000);
System.out.println("Bye");

t1.start();

t2.start();

t3.start();

我知道可以首先安排这些线程中的任何一个。但是,CPU内部究竟发生了什么?我已经读过一本书,其中每个线程都有一些CPU时间,并且为了创建并行运行的错觉而切换了线程。一个线程在将CPU分配给其他线程之前需要花费多少时间?

也可以说,首先安排t1意味着它获得了CPU时间,然后进入睡眠状态达1000ms,如上面的代码所示。现在,让我们说t2获得了CPU时间,并且由于它没有处于睡眠状态,因此它输出“ Hi”。现在t3获得了cpu时间,它睡眠了3000ms,因此t1再次获得了cpu时间。那么现在t1是否从之前离开的地方捡起呢?如果t1仍在休眠,因为自从上次以来没有经过1000毫秒,该怎么办?

我可能会以错误的方式来理解它,但是我在弄乱这些概念。

2 个答案:

答案 0 :(得分:0)

线程是进程的细分,并且共享相同的内存空间。 调度程序决定执行什么线程。它是SO依赖的。

您可以在此处找到更多信息:https://www.javamex.com/tutorials/threads/how_threads_work.shtml

答案 1 :(得分:0)

  

我知道可以首先安排这些线程中的任何一个。但是,CPU内部究竟发生了什么?我已经读过一本书,其中每个线程都有一些CPU时间,并且为了创建并行运行的错觉而切换了线程。一个线程在将CPU分配给其他线程之前需要多少时间?

大多数现代CPU一次可以运行多个线程。如果CPU实际上不能并行运行与希望运行的线程一样多的线程,则调度程序将决定让每个线程运行多长时间。通常,它选择的时间足够短,以使操作感觉平稳但不会频繁切换,以至于切换线程的成本损失会显着影响性能。

  

也可以说,首先安排t1意味着它获得了CPU时间,然后进入睡眠状态达1000ms,如上述代码所示。

当线程进入睡眠状态时,它不再准备运行。

  

现在让我们说t2获得了CPU时间,并且由于它没有处于睡眠状态,因此它会打印“ Hi”。现在t3获得了cpu时间,它睡眠了3000ms,因此t1再次获得了cpu时间。那么现在t1是否从之前离开的地方捡起呢?如果t1仍在休眠,因为自从上次以来没有经过1000毫秒,该怎么办?

如果线程仍在休眠,则该线程尚未准备好运行,因此无法进行调度。线程通过安排自己使其在将来的某个时间准备好运行,然后将其设置为不准备好运行而休眠。只能安排可以运行的线程。如果睡眠时间很短,则可能有例外。

调度程序安排对准备运行的线程进行调度,对不再准备运行的线程进行调度,并在一个线程占用CPU时间太长而无法给其他线程运行时进行切换。存在一些机制,这些机制允许线程等待发生的事情(例如磁盘I / O,网络I / O,超时,其他线程,让它们完成工作等),以安排发生时就可以运行。