中断的执行顺序在该程序中如何工作?

时间:2019-06-07 16:35:55

标签: java multithreading interrupt

我正在阅读Java中的中断实现,但是我不知道控件的运行方式?

代码段为:

NotImplementedError: range_state_int64 cannot be represented as a Numpy dtype

根据我的理解,通过查看构造函数中的执行顺序,应该是:

public class Main implements Runnable
{

 Thread t;

 Main() 
{
  t = new Thread(this);
  t.start();
  t.interrupt();  
  if (!t.interrupted())
  {
  System.out.println("TRUE");
  }
}

 public void run() 
 {
  try 
  {   
   System.out.println("Thread is in running state");
   Thread.sleep(1000);

  } 
  catch (InterruptedException e) 
  {
   System.out.print(t.getName() + " interrupted");
  }
 }

 public static void main(String args[]) 
{
  new Main();
 }
}

但这是错误的。

正确的输出是:

Thread is in running state
Thread-0 interrupted
TRUE

所以请解释该执行命令的工作原理以及原因?


修改1: 如前所述,调用TRUE Thread is in running state Thread-0 interrupted 具有误导性,因此我将构造函数更改为:

t.interrrupted()

所以现在的输出是:

 Main() 
{
  t = new Thread(this);
  t.start();
  t.interrupt();  
  if (!Thread.interrupted())
  {
  System.out.println("TRUE");
  }
}

现在的问题是,

  
      
  1. 由于在调用t.interrupt()时线程处于不可运行状态,那么在这种情况下t.interrupt()会做什么?
  2.   
  3. 为什么要打印输出的最后一行?它从何处获得中断,因为t.interrupt是在线程处于不可运行状态时执行的。
  4.   

2 个答案:

答案 0 :(得分:3)

首先,您正在调用错误的方法。

在另一个答案中指出,interrupted()是一种静态方法,始终检查 current 线程的中断状态。如果要检查t的状态,应致电t.isInterrupted()

第二,您必须记住start()不能保证线程立即开始执行。实际上,这种情况很少发生。新线程仅在调度程序指示执行此操作时才真正开始执行。

所以,正在发生的是:

  • 您正在呼叫start(),但该线程尚未真正启动
  • 您正在检查错误的线程,因为当前线程显然没有被中断
  • 新线程开始运行,并由于先前的interrupt()调用而立即中断

至于EDIT的答案:

  • 您更正了该构造,但是使用了错误的方式。它仍然检查 current 线程,该线程不会被中断
  • 由于新线程 被中断,所以最后一行被打印,因此在启动时,它的中断标志处于打开状态-它立即引发异常

答案 1 :(得分:2)

if (!t.interrupted())

此行有误导性。 interrupted()是一种静态方法,用于检查 current 线程是否已中断,而不是已命名的线程。如果写的话会更好:

if (!Thread.interrupted())