线程是否需要处于 RUNNABLE 状态才能被中断?
Does a thread need to be in a RUNNABLE state before it can be interrupted?
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
根据代码可以看出,中断方法首先被主线程调用。最后我想问一下,有没有可能在线程启动之前首先执行中断调用的情况?
这里发生的是
1) 您启动的线程需要时间准备 运行,因此“主线程结束”可能会首先打印,但不能保证。
2) 在新线程完成启动之前设置中断标志,但在线程休眠之前不会检查该标志的状态。当你在一个只设置标志的线程上调用中断时,线程不会做任何响应,除非你调用 sleep 或 isInterrupted 之类的东西。所以“I am lazy Thread”会在“I got interrupted”之前出现。
中断是自愿的,需要被中断线程的配合。线程在 运行ning 之前不能对中断标志状态进行操作,因为某些代码必须检查标志并对其进行操作。
有可能第 System.out.println("End of main thread");
行在线程启动之前执行。在我的电脑上,程序可能首先、第二个或最后打印 End of main thread
。
关于您的问题,Java 线程没有称为 "ready" 或 "interrupted" 的状态(请参阅 documentation)。 Thread.interrupt()
只会导致线程将其状态更改为 "TERMINATE"。
另见 here:
Interrupting a thread that is not alive need not have any effect.
如果你想让主线程等待另一个线程完成它必须做的事情,你应该做 t.join()
。
Is it necessary for a thread in java to be in ready state before it
gets interrupted by interrupt method?
interrupt
方法并没有真正中断线程。它只设置调用它的线程的中断状态。也就是说,如果您反转对 interrupt
方法和 start
方法的调用,您会注意到 Thread
不会被中断。
MyThread t = new MyThread();
t.interrupt();
t.start();
这应该确认 Thread.interrupt
方法对 Thread
有影响,最低要求是 start
在 Thread
之前被调用interrupt
方法。
注意没有称为就绪状态的线程状态。您指的是 RUNNABLE 状态,表示 start
在 Thread
上被调用
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
根据代码可以看出,中断方法首先被主线程调用。最后我想问一下,有没有可能在线程启动之前首先执行中断调用的情况?
这里发生的是
1) 您启动的线程需要时间准备 运行,因此“主线程结束”可能会首先打印,但不能保证。
2) 在新线程完成启动之前设置中断标志,但在线程休眠之前不会检查该标志的状态。当你在一个只设置标志的线程上调用中断时,线程不会做任何响应,除非你调用 sleep 或 isInterrupted 之类的东西。所以“I am lazy Thread”会在“I got interrupted”之前出现。
中断是自愿的,需要被中断线程的配合。线程在 运行ning 之前不能对中断标志状态进行操作,因为某些代码必须检查标志并对其进行操作。
有可能第 System.out.println("End of main thread");
行在线程启动之前执行。在我的电脑上,程序可能首先、第二个或最后打印 End of main thread
。
关于您的问题,Java 线程没有称为 "ready" 或 "interrupted" 的状态(请参阅 documentation)。 Thread.interrupt()
只会导致线程将其状态更改为 "TERMINATE"。
另见 here:
Interrupting a thread that is not alive need not have any effect.
如果你想让主线程等待另一个线程完成它必须做的事情,你应该做 t.join()
。
Is it necessary for a thread in java to be in ready state before it gets interrupted by interrupt method?
interrupt
方法并没有真正中断线程。它只设置调用它的线程的中断状态。也就是说,如果您反转对 interrupt
方法和 start
方法的调用,您会注意到 Thread
不会被中断。
MyThread t = new MyThread();
t.interrupt();
t.start();
这应该确认 Thread.interrupt
方法对 Thread
有影响,最低要求是 start
在 Thread
之前被调用interrupt
方法。
注意没有称为就绪状态的线程状态。您指的是 RUNNABLE 状态,表示 start
在 Thread