Thread.sleep()如何在内部工作

use*_*199 6 java concurrency multithreading

假设我有一个线程T并且它持有一个资源R.如果我在当前线程上调用Thread.sleep()即T,它会在进入睡眠之前释放资源R(让其他线程使用它) ?或者它将保留该资源,并且当它将唤醒它时将使用资源R并且在完成工作后它将释放它吗?

rac*_*ana 8

这篇Javamex文章:

Thread.sleep()方法的方法有效地"暂停"为在给定时间段内当前线程.我们在第一个线程示例中使用它来使线程定期显示消息,在消息之间休眠.从一开始,重要的是要注意以下事项:

  • 它始终是当前正在进入睡眠状态的线程;

  • 线程可能睡不着了所需的时间(甚至全部);

  • 睡眠持续时间将受制于某些系统特定的 粒度,通常为1ms;

  • 在睡觉时,线程仍然拥有它已经获得的同步锁 ;

  • 睡眠可以中断(有时用于实现取消功能); 使用某些值调用sleep()可能会对操作系统产生一些微妙的全局影响(见下文),反之亦然,系统上运行的其他线程和进程可能会对观察到的睡眠持续时间产生微妙的影响.


Nas*_*din 6

首先,Thread.sleep()是阻塞库方法.线程可能会阻塞或暂停,原因如下:等待I/O完成,等待获取锁定,等待从Thread.sleep唤醒,或等待另一个线程中的计算结果.当线程阻塞时,它通常被挂起并置于其中一个被阻塞的线程状态中.

__PRE__

Java并发API有另一种使Thread对象离开CPU的方法.它是yield()方法,它向JVM指示Thread对象可以离开CPU执行其他任务.JVM不保证它将遵守此请求.通常,它仅用于调试目的.

与sleep()混淆的一个原因是它与对象类的wait()方法有何不同

__PRE__

希望它会有所帮助!干杯...


The*_*ind 3

即将休眠的线程将(not release resource)在休眠时持有锁。睡眠线程在其睡眠期间甚至不会被调度(或者直到它被中断然后被唤醒)