线程在被中断之前是否需要处于RUNNABLE状态?

时间:2017-11-11 12:48:17

标签: java multithreading interrupt

java中的线程是否需要在被中断方法中断之前处于就绪状态? 我试着通过在下面输入上面给出的代码来检查这个。

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

根据代码可以看出,主线程首先调用中断方法。最后我想问一下,在线程开始之前首先执行中断调用时是否有任何可能的情况?

4 个答案:

答案 0 :(得分:2)

  

java中的线程是否必须在它之前处于就绪状态   被中断方法打断?

interrupt方法并没有真正中断线程。它仅设置调用它的线程的中断状态。也就是说,如果您撤消对interrupt方法和start方法的调用,您会注意到Thread不会被中断。

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

这应该确认Thread.interrupt方法对Thread产生影响,最低要求是在start之前Thread调用interrupt {1}}方法。

注意没有称为就绪状态的线程状态。您所指的是 RUNNABLE 状态,表示start上已调用Thread

答案 1 :(得分:1)

这里发生的是

1)您启动的线程需要时间准备好运行,因此“主线程结束”可能会先打印,但不能保证。

2)在新线程启动之前设置中断标志,但在线程休眠之前没有任何东西检查该标志的状态。当您在仅设置标志的线程上调用中断时,除非您调用sleep或isInterrupted等内容,否则线程不会做任何响应。所以“我很懒的线程”会在“我被打断”之前出现。

中断是自愿的,需要中断线程的合作。线程在运行之前不能作用于中断标志状态,因为某些代码必须检查该标志并对其进行操作。

答案 2 :(得分:0)

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

至于你的问题,Java线程没有一个名为&#34; ready&#34;也没有&#34;打断&#34; (见documentation)。 Thread.interrupt()只会导致一个线程将其状态更改为&#34; TERMINATE&#34;。

另见here

  

中断非活动的线程无需任何效果。

答案 3 :(得分:0)

如果您希望主线程等待其他线程完成它必须执行的操作,您应该执行t.join()