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

ben*_*enz 1 java multithreading

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

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

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

ass*_*ias 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();
}
Run Code Online (Sandbox Code Playgroud)

打印:

sleeper is going to sleep
sleeper got interrupted
Run Code Online (Sandbox Code Playgroud)

  • 睡眠者睡了10秒钟,但是因为它在另一个线程中运行并且这个并不是必须立即创建的,所以主要将等待500ms(足以创建另一个线程的时间)然后打断睡眠者 (3认同)
  • @benz Runnable只是一个任务的容器,可以在将来由一个线程运行.声明Runnable不会运行它,因为你需要一个线程来运行它(在我的情况下是`t`).当你调用`t.start`时,会发生两件事:创建一个新线程,它将能够与主线程并行运行,并且`sleeper`的`run`方法在该并行线程中执行.然后主线程继续正常执行.因此,当调用`t.interrupt`时,`t`已经运行了大约500毫秒并且仍在睡觉...... (2认同)