假设我有一个线程T,它正在占用一个资源R。如果在当前线程即T上调用Thread.sleep(),那么它会在休眠之前释放资源R(以便让其他线程使用它)吗?还是它会保持该资源,并且当它醒来时再次使用资源R,在完成工作后才释放它?
假设我有一个线程T,它正在占用一个资源R。如果在当前线程即T上调用Thread.sleep(),那么它会在休眠之前释放资源R(以便让其他线程使用它)吗?还是它会保持该资源,并且当它醒来时再次使用资源R,在完成工作后才释放它?
从这篇Javamex文章中:
Thread.sleep()方法会暂停当前线程一段时间。我们在第一个线程示例中使用它来定期显示消息,并在消息之间休眠。重要的是要意识到以下几点:
永远是当前线程被暂停;
线程可能无法按照要求的时间(甚至根本不会)休眠;
休眠持续时间将受到某些系统特定的粒度的影响,通常为1毫秒;
在休眠时,线程仍然拥有已获得的同步锁;
休眠可以被中断(有时用于实现取消函数);使用某些值调用sleep()可能会对操作系统产生一些微妙的全局影响(请参见下文),反之,系统上运行的其他线程和进程可能对观察到的休眠持续时间产生微妙的影响。
将要睡眠的线程在睡眠期间将保持锁定状态(不释放资源)
。睡眠的线程甚至不会被调度,在它睡眠期间(或直到被中断并唤醒)。
Javadoc 中写道 - sleep()
: 使当前正在执行的线程在指定的毫秒数内休眠(暂停执行),具体取决于系统计时器和调度程序的精度和准确性。
Thread.sleep() 方法实际上与线程调度器交互,将当前线程置于等待状态,直到所需时间间隔结束。但是,该线程不会失去任何监视器的所有权。
为了允许中断,实现可能实际上并没有使用大多数操作系统提供的显式睡眠函数。
如果当前线程被阻塞在 Object 类的 wait()、wait(long)、wait(long, int) 方法或 Thread 类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法的调用中,则它的中断状态将被清除,并接收 InterruptedException 异常。