我正在阅读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
至于主要问题 - 睡眠线程不能因为它睡觉而自行中断,但任何其他线程可以试图破坏睡眠的线程。 Here you have doc explaining threads and thread lifecycle.
谢谢@Antoniosss,我有点困惑,会发送中断的线程,是否应该具有相同的Runnable? – benz
是的,只有另一个线程可以发送中断到睡眠线程。线程不可能向自己发送中断(简单地将其与现实生活对比,如果某人正在睡觉然后唤醒他,我们需要其他人)。是的,中断一个线程后可以回到Runnable
状态。
第二句困扰我,它允许线程自行中断。从Oracle文档中断开中断线程“除非当前线程正在自行中断,这总是被允许的......” – Antoniossss
线程不可能自行中断。 – user2550754
据我所知,它导致中断的另一个线程。所以当一个线程在一段时间内调用睡眠时,Java运行时会记录下来,当时间流逝时,它会导致唤醒睡眠线程的中断。
谢谢,这两个线程是否需要在相同的Runnable上运行? – benz
编写代码时,第二个线程不应该关注你。因为这是运行代码本身的JRE线程。 – 2013-08-08 10:22:30
线程可以中断自己。它总是可能的。
实施例是:
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。 或
当您想要学习多线程时,最好使用ExecutorServices,它们更容易使用,更强大。我个人认为,使用普通线程有点过时,并且使多线程比需要的更加复杂。 – ssindelar
@Casey即使在Executor框架内,了解中断过程也很重要。 – assylias
@Casey,我很新的线程,所以首先只是刷新基础知识。 – benz