在上述语句中,“before”是什么意思?在执行obj.wait()之前是指在其上方定义的任何指令之前吗?
这意味着,如果线程在调用wait()方法之前被中断,那么当实际调用wait()方法时,仍会抛出InterruptedException异常。
为了尝试这种情况,我编写了以下代码来启动线程并中断它。此线程的run()方法循环INTEGER.MAX_VALE-1次,并调用wait()方法。在到达调用wait()方法的时候,线程已经被中断。随后,在调用wait()方法时,它抛出了InterruptedException异常。
public class ThreadWaitInterruption {
static Object obj = new Object();
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Started Thread");
for(int i = 0; i < Integer.MAX_VALUE; i++) {
int j = i/2;
}
System.out.println("Loop completed");
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
System.out.println("Interrupting");
t.interrupt();
System.out.println("Interuupted");
}
}
样例输出,使用1.8 Java热点(TM) 64位版本测试。
Interrupting
Started Thread
Interuupted
Loop completed
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at com.demo.threads.ThreadWaitInterruption$1.run(ThreadWaitInterruption.java:19)
at java.lang.Thread.run(Thread.java:745)
或者
Started Thread
Interrupting
Interuupted
Loop completed
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at com.demo.threads.ThreadWaitInterruption$1.run(ThreadWaitInterruption.java:19)
at java.lang.Thread.run(Thread.java:745)
在中断线程之前调用wait()
方法,即使线程在调用wait()
方法之前被中断,调用wait()
方法也会导致抛出InterruptedException
异常。
注意:由于这是一个多线程程序,以上输出的顺序不能保证,我们可能需要运行此程序几次才能得到上述确切的输出。