Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程在被中断之前是否需要处于可运行状态?_Java_Multithreading_Interrupt_Interruption - Fatal编程技术网

Java 线程在被中断之前是否需要处于可运行状态?

Java 线程在被中断之前是否需要处于可运行状态?,java,multithreading,interrupt,interruption,Java,Multithreading,Interrupt,Interruption,java中的线程在被中断方法中断之前是否必须处于就绪状态? 我试图通过在下面输入上面给定的代码来检查这一点 class MyThread extends Thread { public void run() { try { for(int i =0;i<10;i++) { System.out.println("I am lazy thread"); Thread.s

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");
    }
}
为什么输出不能是

I am lazy thread
I got interrupted
End of main thread
根据代码可以看出,中断方法首先由主线程调用。最后,我想问,在线程启动之前执行中断调用时,是否有可能出现任何情况?

这里发生的是

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

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


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

System.out.println(“主线程结束”)在线程启动之前执行。在我的计算机上,程序可以打印主线程的第一个、第二个或最后一个

至于您的问题,Java线程没有所谓的“就绪”或“中断”状态(请参阅)
Thread.interrupt()
只会导致线程将其状态更改为“终止”

另见:

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


如果希望主线程等待另一个线程完成它必须执行的操作,则应执行
t.join()

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

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

MyThread t = new MyThread();
t.interrupt();
t.start();
这应该确认,对于
线程.interrupt
方法要对
线程
产生影响,最低要求是在
中断
方法之前对
线程
调用
启动


注意没有称为就绪状态的线程状态。您所指的是状态,它表明
线程调用了
启动

我感谢您的回答,但我想问的是,在调用睡眠之前,进行中断调用的线程是否需要处于就绪状态。然后在进入中断状态之前,线程必须处于睡眠状态。因此,要使线程中断,线程必须首先处于就绪状态。是吗?@Deep:这样更好吗?此外,有时在代码中的t.start()之后会首先调用子线程,以使线程在必须运行的中断状态下运行。我不知道如何说得更清楚。是的…这就是我想听到的,线程被中断…在中断被调用之前,它必须处于就绪状态…我知道了…谢谢
MyThread t = new MyThread();
t.interrupt();
t.start();