2013-08-07 32 views
1

我正在阅读Java线程。我正在调查sleep()方法。这些书指出,睡眠线程如何发送中断给自己?

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

我在阅读有关中断的问题,但线程如何将中断发送给自己?我想这样 另一个线程可以发送中断吗?我理解正确吗?另外,做两个 的线程,一个会发送中断的应该是有相同的目标Runnable?如果 假设一个线程被中断,是否回到Runnable状态?我真的很抱歉, 如果我听起来很愚蠢,这对我来说是非常新的。谢谢

+0

当您想要学习多线程时,最好使用ExecutorServices,它们更容易使用,更强大。我个人认为,使用普通线程有点过时,并且使多线程比需要的更加复杂。 – ssindelar

+0

@Casey即使在Executor框架内,了解中断过程也很重要。 – assylias

+0

@Casey,我很新的线程,所以首先只是刷新基础知识。 – benz

回答

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 
+0

我有点困惑你的榜样。在这里,你正在睡觉睡觉()在可运行。然后你再次在main方法中使当前线程进入sleep()。在这种情况下,即使main也可以睡觉,因为它也可以是当前线程。然后你在枕木实例本身上调用interrupt()。这不是有点矛盾,线程不能中断自己。我确信,我以错误的方式感受到了一个例子,你能详细说明吗? – benz

+3

睡眠者睡眠10秒,但因为它在另一个线程中运行,并且这个不需要立即创建,所以在中断睡眠之前,主要等待500ms(足以创建另一个线程的时间) –

+0

啊我得到了现在看到图片。正确。非常感谢你。 – benz

0

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

+0

第二句困扰我,它允许线程自行中断。从Oracle文档中断开中断线程“除非当前线程正在自行中断,这总是被允许的......” – Antoniossss

+0

线程不可能自行中断。 – user2550754

0

据我所知,它导致中断的另一个线程。所以当一个线程在一段时间内调用睡眠时,Java运行时会记录下来,当时间流逝时,它会导致唤醒睡眠线程的中断。

+0

谢谢,这两个线程是否需要在相同的Runnable上运行? – benz

+0

编写代码时,第二个线程不应该关注你。因为这是运行代码本身的JRE线程。 – 2013-08-08 10:22:30

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"); 
    } 
} 

调用中断不会抛出exception.It设置中断状态标志
当该线程被阻塞在等待的调用()等待(长),或等待(长,INT)Object类的方法或的加入()加入(长)加入(长,INT)睡眠(长),或睡眠(长,INT),这个类的方法,那么它的中断状态将被清除,它会得到一个InterruptedException。 或

+0

你在睡觉时能打断自己吗? :D – MrROY

+0

线程可以自行中断,但不能在睡眠时中断。在你的例子中,线程从不睡觉,因为当调用睡眠时,它意识到它已被中断并立即抛出异常。睡眠也是一种静态方法,所以你可以使用Thread.sleep。 – assylias

+0

@assylias我同意你的意见 – Prabhaker