1

我正在阅读 Java 线程。我正在研究sleep()方法。书中指出

当线程遇到sleep调用时,它必须在指定的时间内进入睡眠状态,除非它在唤醒时间之前被中断。

我正在阅读有关中断的信息,但是线程如何向自身发送中断?我认为这样另一个线程可以发送中断?我理解正确吗?此外,两个线程,一个将发送中断的线程应该具有相同的目标 Runnable 吗?如果假设一个线程被中断,它会回到Runnable状态吗?我真的很抱歉,如果我听起来很愚蠢,那对我来说只是很新。谢谢

4

5 回答 5

5

一个线程在睡眠时不能中断自己,因为它正在……睡眠。

一张图片值一千字,所以这里有一个简单的例子,一个线程开始休眠,主线程中断它:

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
于 2013-08-07T09:34:37.877 回答
0

根据线程#interrupt

线程可以自行中断。总是有可能的。

示例是:

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。或者

于 2013-08-07T09:38:09.143 回答
0

是的,只有另一个线程可以向睡眠线程发送中断。线程不可能向自己发送中断(简单地将其与现实生活进行对比,如果一个人正在睡觉,那么要唤醒他,我们需要其他人)。是的,在中断线程后返回Runnable状态。

于 2013-08-07T09:24:17.220 回答
0

据我所知,它是另一个导致中断的线程。所以当一个线程调用 sleep 一定时间时,Java Runtime 会记录下来,当时间过去时,它会引起中断,唤醒睡眠线程。

于 2013-08-07T09:26:01.797 回答
0

至于主要问题 - 睡眠线程不能因为它睡眠而中断自己,但是任何其他线程都可以尝试中断睡眠线程。在这里,您有解释线程和线程生命周期的文档。

于 2013-08-07T09:23:06.807 回答