我正在阅读 Java 线程。我正在研究sleep()
方法。书中指出
当线程遇到
sleep
调用时,它必须在指定的时间内进入睡眠状态,除非它在唤醒时间之前被中断。
我正在阅读有关中断的信息,但是线程如何向自身发送中断?我认为这样另一个线程可以发送中断?我理解正确吗?此外,两个线程,一个将发送中断的线程应该具有相同的目标 Runnable 吗?如果假设一个线程被中断,它会回到Runnable
状态吗?我真的很抱歉,如果我听起来很愚蠢,那对我来说只是很新。谢谢
我正在阅读 Java 线程。我正在研究sleep()
方法。书中指出
当线程遇到
sleep
调用时,它必须在指定的时间内进入睡眠状态,除非它在唤醒时间之前被中断。
我正在阅读有关中断的信息,但是线程如何向自身发送中断?我认为这样另一个线程可以发送中断?我理解正确吗?此外,两个线程,一个将发送中断的线程应该具有相同的目标 Runnable 吗?如果假设一个线程被中断,它会回到Runnable
状态吗?我真的很抱歉,如果我听起来很愚蠢,那对我来说只是很新。谢谢
一个线程在睡眠时不能中断自己,因为它正在……睡眠。
一张图片值一千字,所以这里有一个简单的例子,一个线程开始休眠,主线程中断它:
public static void main(String[] args) throws Exception {
Runnable sleeper = new Runnable() {
public void run() {
try {
System.out.println("sleeper is going to sleep");
Thread.sleep(1000);
System.out.println("sleeper is awake");
} catch (InterruptedException e) {
System.out.println("sleeper got interrupted");
}
}
};
Thread t = new Thread(sleeper);
t.start(); //run sleeper in its own thread
Thread.sleep(500); //sleeping in main a little to make sure t is started
t.interrupt();
}
打印:
sleeper is going to sleep
sleeper got interrupted
线程可以自行中断。总是有可能的。
示例是:
public static void main(String[] args) throws ParseException, InterruptedException {
Thread.currentThread().interrupt();
try{
Thread.currentThread().sleep(200);
}catch(InterruptedException ie){
System.out.println("Current thread is interrupted");
}
}
调用中断永远不会抛出异常。它设置中断状态标志。
当该线程在调用Object 类的wait()、wait(long)或wait(long, int)方法或join()、join(long)、join(long, int)时被阻塞, sleep(long) , or sleep(long, int) , 这个类的方法,那么它的中断状态将被清除,它会收到一个InterruptedException。或者
是的,只有另一个线程可以向睡眠线程发送中断。线程不可能向自己发送中断(简单地将其与现实生活进行对比,如果一个人正在睡觉,那么要唤醒他,我们需要其他人)。是的,在中断线程后返回Runnable
状态。
据我所知,它是另一个导致中断的线程。所以当一个线程调用 sleep 一定时间时,Java Runtime 会记录下来,当时间过去时,它会引起中断,唤醒睡眠线程。
至于主要问题 - 睡眠线程不能因为它睡眠而中断自己,但是任何其他线程都可以尝试中断睡眠线程。在这里,您有解释线程和线程生命周期的文档。