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
根据代码可以看出,主线程首先调用中断方法。最后我想问一下,在线程开始之前首先执行中断调用时是否有任何可能的情况?
答案 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()
。