线程是否需要处于RUNNABLE状态才能被中断?

线程是否需要处于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之类的东西上。所以“我很懒”会在“我被打断”之前出现。

中断是自愿的,需要中断线程的配合。线程不能在中断标志状态下运行,直到它正在运行,因为某些代码必须检查标志并对其执行操作。

+0

我很欣赏你的反应,但我要问的是,无论是在哪个中断已经调用线程,需要在调用睡眠之前的就绪状态。然后在进入中断状态之前,线程必须处于睡眠状态。因此,传递线程中断的线程必须先处于就绪状态。不是吗? –

+0

@Deep:那是更好吗? –

+0

此外,在代码 –

在线程启动之前可能会执行System.out.println("End of main thread");行。在我的计算机上,程序可能会打印End of main thread第一个,第二个或最后一个。

至于你的问题,Java线程没有一个叫做“就绪”或“中断”的状态(见documentation)。 Thread.interrupt()只是导致线程将其状态更改为“TERMINATE”。

另见here

中断一个线程是不是还活着不需要有任何影响。

+0

一个活的线程意味着哪个实际上可以运行......对吧? –

如果你想让主线程等待另一个线程完成它必须做的事情,你应该做t.join()

+0

是的......这是正确的......感谢您的回应 –

是否有必要让java中的线程处于就绪状态,然后 被中断方法中断?

interrupt方法不会真的中断该线程。它只设置被调用的线程的中断状态。也就是说,如果您调用interrupt方法和start方法,您会注意到Thread不会中断。

MyThread t = new MyThread(); 
t.interrupt(); 
t.start(); 

这应当确认为Thread.interrupt方法有一个Thread的作用,其最低要求将是start是在interrupt方法之前呼吁Thread

注意没有线程状态称为就绪状态。你指的是RUNNABLE状态,这表明start是呼吁Thread

+0

是的......其实我的意思是说runnable状态......感谢您的回复 –