线程执行时CPU内部真正发生了什么?

问题描述 投票:1回答:2

我认为我在思考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毫秒怎么办?

我可能会以错误的方式接受它,但我正在耍弄这些概念。

java multithreading thread-sleep
2个回答
0
投票

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

你可以在这里找到更多信息:https://www.javamex.com/tutorials/threads/how_threads_work.shtml


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,超时,其他线程以便让它们工作,等等),通过安排在事情发生时准备好运行。

© www.soinside.com 2019 - 2024. All rights reserved.