我知道Java中睡眠方法的行为。 当我调用sleep方法时,当前正在执行的线程将停止它的执行并进入睡眠状态。当它处于睡眠状态时,它会获得锁定。
例如,如果我按如下方式调用sleep方法 了Thread.sleep(50) 我的Q是50ms后发生的事情。 它会唤醒并直接开始执行或 它将进入可运行状态并等待CPU给它一个机会执行? 换句话说,它将进入Runnable状态并与其他线程争夺CPU。
请让我知道答案。
答案 0 :(得分:3)
它将进入可运行状态。从来没有保证线程将在特定时刻执行。但是你可以设置线程的优先级,以便更好地获得CPU时间。
答案 1 :(得分:1)
由操作系统调度程序决定。通常,如果睡眠“足够小”并且线程剩余足够的时间片,则线程将保持在核心上并在睡眠结束时立即恢复。如果睡眠“太长”(通常大约10ms或更长),那么核心将可以进行其他工作,并且线程将在睡眠结束时准备好运行。根据相对优先级,新的可立即运行的线程可能会抢占当前正在运行的线程。
答案 2 :(得分:1)
实际上,这取决于您使用的操作系统,不同的操作系统有不同的进程scheduling algorithms。
大多数桌面操作系统都不是实时操作系统。无法保证睡眠的精确度。当您调用sleep时,线程将暂停,并且在请求的持续时间过去之前无法运行。当它再次可运行时,由于某些执行时间可用,它可以由调度程序再次运行该线程。
例如,大多数Linux发行版使用CFS作为默认调度算法CFS使用一个名为" sleeper fairness"的概念,它考虑睡眠或等待任务等同于runqueue上的任务。因此,在您的情况下,睡眠后的线程将获得相当的CPU时间份额。
答案 3 :(得分:0)
它将进入可运行状态并等待CPU给它机会执行