当前位置: 首页 > 面试题库 >

有线程调度程序时,如何并行执行线程?

丘浩宕
2023-03-14
问题内容

根据我一直在阅读的定义:

线程基本上是并发(同时)运行的代码段

但是,如何在存在线程调度程序的情况下同时运行它们?

我读到,线程调度程序基本上是从Runnable线程池中随机选择一个线程在某个时刻运行。从中我得到一个确切的时间点,只有一个可运行线程真正处于运行状态(运行)。(
所有这些均来自SCJP Sun认证程序员学习指南 )有人可以澄清吗?

这些线程是否真正同时运行?


问题答案:

但是,如何在存在线程调度程序的情况下同时运行它们?

它们并不总是并发运行,调度程序的工作是交换正在运行的线程,以便它们看起来似乎并发运行。即太快,您看不到。

调度程序使用的时间片为0.1毫秒。您只能看到10到25毫秒的闪烁,因此这太快了,您看不到,但是它正在快速交换线程,因此看起来存在并发性。

例如,您看不到电影从一帧跳到下一帧。每帧每1/42秒更改一次,因此您认为在实际使用高速相机拍摄时会看到动静,屏幕看起来跳动。

如果您有一个逻辑CPU,则所有线程都将交换到一个CPU。如果您有多个逻辑CPU,则可以立即运行一小部分,其余的则需要等待。



 类似资料:
  • 调度并执行内核线程 initproc 在uCore执行完proc_init函数后,就创建好了两个内核线程:idleproc和initproc,这时uCore当前的执行现场就是idleproc,等到执行到init函数的最后一个函数cpu_idle之前,uCore的所有初始化工作就结束了,idleproc将通过执行cpu_idle函数让出CPU,给其它内核线程执行,具体过程如下: void cpu_i

  • 我需要执行一些任务。有些任务是独立的,有些任务依赖于其他任务的成功执行。独立任务可以并行运行以获得更好的性能。我把这些任务称为服务。列说明哪些服务将以串联方式执行,哪些服务将以并联方式执行。列描述了一组定义的服务所遵循的执行顺序。例如,服务A和B应该并行运行。如果它们已成功执行,则将执行服务C。请注意,服务C并不直接依赖于其先前服务的输出,但它必须在成功执行其先前服务后运行,因为服务C在执行期间需

  • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

  • 所以基本上我将为我的应用程序更新GUI,所以我使用静态方法 void javax.swing.SwingUtilities。invokeLater(可运行doRun) 但我想把我的初始化代码放在可运行的地方,把逻辑代码放在外面。但是,如果我调用方法,我的主线程和AWT线程将处于争用状态,因为我的主进程将在调用 方法之后尝试调用我的逻辑代码,但由于JFrame(在我的例子中)尚未初始化,所以我的主程

  • 问题内容: 我一直在尝试解决涉及使用wait()和notify()的线程通信的问题。基本上我有2个线程T1和T2,我希望它们按以下顺序执行 T1,T2,T1,T2 .....我该如何实现? 实际的问题:有两个线程T1-打印奇数(例如1-100),而T2-打印偶数(1-100)。现在,输出应为1,2,3,4,5,.... 100 问题答案: 您描述了生产者-消费者模式。 它是Java的实现,在许多J

  • 我们有一个基于quartz的调度程序应用程序,每分钟运行大约1000个作业,这些作业平均分布在每分钟的几秒钟内,即每秒大约16-17个作业。理想情况下,这16-17个作业应该同时触发,但是我们的第一条语句,它只是记录执行的时间,任务的execute方法调用得很晚。假设从05:00到05:04,我们每分钟安排1000个工作。因此,理想情况下,计划在05:03:50的作业应该在05:03:50记录ex