线程是否需要处于RUNNABLE状态才能被中断?
Java中的线程在被中断方法中断之前是否需要处于就绪状态? 我试图通过在下面输入上面给出的代码来检查这一点。线程是否需要处于RUNNABLE状态才能被中断?
class MyThread extends Thread
{
public void run() {
try
{
for(int i =0;i<10;i++) {
System.out.println("I am lazy thread");
Thread.sleep(2000);
}
}
catch(InterruptedException e) {
System.out.println("I got interrupted");
}
}
}
public class SleepAndInterruptDemonstrationByDurga {
public static void main(String[] args) {
MyThread t= new MyThread();
t.start();
t.interrupt();
System.out.println("End of main thread");
}
}
输出什么我总是被下面的一个尝试,即使经过多次
End of main thread
I am lazy thread
I got interrupted
为什么不能输出是
I am lazy thread
I got interrupted
End of main thread
因为根据它的代码可以看出,主线程首先调用中断方法。最终,我想问一下,在线程开始之前执行中断调用时是否有可能发生任何情况?
这里会发生什么事是
1)启动线程需要时间来准备运行,所以“主线程结束”可能是要首先打印,虽然这不能保证。 2)在新线程开始前设置中断标志,但在线程休眠之前没有检查该标志的状态。当你在一个只设置标志的线程上调用中断时,线程不会做任何响应,除非你把调用放在诸如sleep或isInterrupted之类的东西上。所以“我很懒”会在“我被打断”之前出现。
中断是自愿的,需要中断线程的配合。线程不能在中断标志状态下运行,直到它正在运行,因为某些代码必须检查标志并对其执行操作。
在线程启动之前可能会执行System.out.println("End of main thread");
行。在我的计算机上,程序可能会打印End of main thread
第一个,第二个或最后一个。
至于你的问题,Java线程没有一个叫做“就绪”或“中断”的状态(见documentation)。 Thread.interrupt()
只是导致线程将其状态更改为“TERMINATE”。
另见here:
中断一个线程是不是还活着不需要有任何影响。
一个活的线程意味着哪个实际上可以运行......对吧? –
如果你想让主线程等待另一个线程完成它必须做的事情,你应该做t.join()
。
是的......这是正确的......感谢您的回应 –
是否有必要让java中的线程处于就绪状态,然后 被中断方法中断?
interrupt
方法不会真的中断该线程。它只设置被调用的线程的中断状态。也就是说,如果您调用interrupt
方法和start
方法,您会注意到Thread
不会中断。
MyThread t = new MyThread();
t.interrupt();
t.start();
这应当确认为Thread.interrupt
方法有一个Thread
的作用,其最低要求将是start
是在interrupt
方法之前呼吁Thread
。
注意没有线程状态称为就绪状态。你指的是RUNNABLE状态,这表明start
是呼吁Thread
是的......其实我的意思是说runnable状态......感谢您的回复 –
我很欣赏你的反应,但我要问的是,无论是在哪个中断已经调用线程,需要在调用睡眠之前的就绪状态。然后在进入中断状态之前,线程必须处于睡眠状态。因此,传递线程中断的线程必须先处于就绪状态。不是吗? –
@Deep:那是更好吗? –
此外,在代码 –