java.lang.Thread.sleep(Native Method)是怎么产生的
时间: 2023-06-03 15:05:44 浏览: 270
java.lang.Thread.sleep(Native Method)是Java中的一个方法,它被用来暂停当前线程的执行,以等待指定的时间。这个方法是由Java虚拟机实现的本地代码实现的,也就是说,这个方法的具体实现取决于你使用的JVM。
具体来说,当你调用Thread.sleep()方法时,当前线程会被挂起,直到指定的时间过去。在这段时间内,其他线程可以继续执行。
需要注意的是,Java中的线程调度是不可控的,因此,即使你指定了一个特定的时间,也不能保证在这个时间点上一定会恢复当前线程的执行。同时,在调用这个方法时需要谨慎,以避免产生意外的结果。
相关问题
sleep interrupted at java.lang.Thread.sleep(Native Method)
异常信息 "sleep interrupted" 是由 Java 中的 Thread.sleep() 方法抛出的 InterruptedException 异常引发的。该异常在线程休眠期间,如果线程被其他线程中断,则会被抛出。
在你提供的异常堆栈跟踪中,"at java.lang.Thread.sleep(Native Method)" 表示异常发生在 java.lang.Thread 类的 sleep() 方法调用处。这是因为 sleep() 方法是一个本地方法(native method),具体实现由底层操作系统提供。
当线程调用 sleep() 方法时,它会暂停执行一段时间,以便给其他线程执行的机会。然而,如果在线程休眠期间,其他线程调用了该线程的 interrupt() 方法,那么该线程会被中断并抛出 InterruptedException 异常。
处理这个异常的常见做法是在捕获 InterruptedException 异常时,进行相应的处理逻辑,例如恢复线程的中断状态或者退出线程。
Thread-0: started false: started Thread-0: is running Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:326) at ThreadInterrupt$1.run(ThreadInterrupt.java:11) at java.base/java.lang.Thread.run(Thread.java:835) main: stopped
这个错误是因为在线程中调用了wait()方法,但是没有获取到对象锁。wait()方法只能在synchronized块中使用,否则就会抛出IllegalMonitorStateException异常。
你可以将wait()方法调用放到synchronized块中,或者使用Lock对象来代替synchronized块。例如:
```
public void run() {
System.out.println(Thread.currentThread().getName() + ": started");
System.out.println(Thread.currentThread().isInterrupted() + ": started");
synchronized (this) {
while (!Thread.currentThread().isInterrupted()) {
System.out.println(Thread.currentThread().getName() + ": is running");
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + ": interrupted when sleep");
System.out.println(Thread.currentThread().isInterrupted() + ": interrupted getState()");
Thread.currentThread().interrupt();
System.out.println(Thread.currentThread().isInterrupted() + ": interrupted getState()");
}
}
}
System.out.println(Thread.currentThread().getName() + ": exiting");
}
```
这样修改后,就不会再出现IllegalMonitorStateException异常了。
阅读全文