在Java中,我知道默认线程优先级为5。
我有一个类,基本上一边睡n秒钟,一边一边做其他事情。
如果我以随机顺序创建20个线程,每个线程都以该类为目标,且n为10或20秒,那10秒全部先完成,然后20秒全部完成是怎么回事。

我以为会发生这种情况,因为我运行的是双核处理器,所以实际上只能同时运行2个线程。因此,调度程序将任意选择2个线程,因为它们的优先级都相同,然后首先运行它们,这意味着有时20秒的线程将必须在10秒的线程之前运行,依此类推。

最佳答案

我认为这是因为线程的数量比调度时的运行时间(10或20秒)要小得多。即使20s线程首先进入运行队列,它实际上也不会一次全部运行完成。时间片用完后,线程调度程序会将其撞回等待队列,这可能是比较短的时间。

请参阅here,以获得有关线程调度算法的不错的文章。基本的摘要是,每个线程将运行少量时间(也许以毫秒为单位),然后将其换出另一个线程。此线程交换将继续进行,直到所有线程完成。

另外,关于调度的Wikipedia entry相当不错。尽管其中一些专门涉及进程调度,但是现代OS通常以相同的方式处理线程。

10-04 13:05