2

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

4 回答 4

3

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

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

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

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

注意没有称为就绪状态的线程状态。您指的是RUNNABLE状态,它表示startThread

于 2017-11-11T16:02:56.600 回答
1

这里发生的是

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

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

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

于 2017-11-11T13:56:41.547 回答
0

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

至于您的问题,Java 线程没有称为“就绪”或“中断”的状态(请参阅文档)。Thread.interrupt()只是导致线程将其状态更改为“TERMINATE”。

另见此处

中断一个不活动的线程不需要有任何效果。

于 2017-11-11T14:14:26.593 回答
0

如果您希望主线程等待其他线程完成它必须做的事情,您应该这样做t.join()

于 2017-11-11T14:28:06.063 回答