睡眠线程如何向自身发送中断?

时间:2013-08-07 09:20:01

标签: java multithreading

我正在阅读Java Threads。我正在研究sleep()方法。这些书说明了

  

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

我正在阅读关于中断的内容,但是线程如何向自身发送中断?我认同 另一个线程可以发送中断?我理解正确吗?另外,做两件事 线程,一个将发送中断的应该具有相同的目标Runnable?如果 假设一个线程被中断,它是否会回到Runnable状态?真的对不起, 如果我听起来很愚蠢,那对我来说真是太新了。感谢

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

至于主要问题 - 睡眠线程不会因为睡眠而中断自身,但任何其他线程都可以试图破坏睡眠线程。 Here you have doc explaining threads and thread lifecycle.

答案 2 :(得分:0)

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

答案 3 :(得分:0)

据我所知,它的另一个线程会导致中断。因此,当一个线程调用sleep一段时间后,Java Runtime会记下这一点,当时间过去后,它会导致中断唤醒休眠线程。

答案 4 :(得分:0)

根据Thread#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");
  }
}

调用中断永远不会抛出异常。它设置中断状态标志
当在调用 wait() wait(long) wait(long,int)方法时阻止此线程对象类,或者 join() join(long) join(long,int) sleep(long) sleep(long,int),此类的方法,然后其中断状态将被清除,它将收到InterruptedException。 或