我正在阅读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");
}
}
现在的问题是,
- 由于在调用t.interrupt()时线程处于不可运行状态,那么在这种情况下t.interrupt()会做什么?
- 为什么要打印输出的最后一行?它从何处获得中断,因为t.interrupt是在线程处于不可运行状态时执行的。
答案 0 :(得分:3)
首先,您正在调用错误的方法。
在另一个答案中指出,interrupted()
是一种静态方法,始终检查 current 线程的中断状态。如果要检查t
的状态,应致电t.isInterrupted()
。
第二,您必须记住start()
不能保证线程立即开始执行。实际上,这种情况很少发生。新线程仅在调度程序指示执行此操作时才真正开始执行。
所以,正在发生的是:
start()
,但该线程尚未真正启动interrupt()
调用而立即中断至于EDIT的答案:
答案 1 :(得分:2)
if (!t.interrupted())
此行有误导性。 interrupted()
是一种静态方法,用于检查 current 线程是否已中断,而不是已命名的线程。如果写的话会更好:
if (!Thread.interrupted())