一.当线程呈wait()状态时,调用线程对象的interrupt方法会出现InterruptedException异常。
二.案例:
1)代码:
package org.zhq.test;
import java.util.ArrayList;
import java.util.List;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-13 下午1:52:21
* 类说明
*/
public class Service {
public void testMethod(Object lock){
try {
synchronized (lock) {
System.out.println("begin wait()");
lock.wait();
System.out.println(" end wait()");
}
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("出现异常了,因为呈wait状态的线程被interrupt了!");
}
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-13 上午11:33:08
* 类说明
*/
public class ThreadA extends Thread {
private Object lock;
public ThreadA( Object lock){
super();
this.lock=lock;
}
@Override
synchronized public void run() {
try {
Service ser=new Service();
ser.testMethod(lock);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package org.zhq.test;
/**
* @author 作者 hq.zheng:
* @version 创建时间:2018-6-11 下午3:02:47
* 类说明
*/
public class Run {
public static void main(String[] args) throws InterruptedException {
Object lock=new Object();
ThreadA a=new ThreadA(lock);
a.start();
Thread.sleep(1000);
a.interrupt();
}
}
2)结果:
三.结论:
1)执行完代码块就会释放对象锁。
2)在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。
3)在执行同步代码块的过程中,执行了锁所属对象的wait方法,这个线程会释放对象锁,从而此线程对象会进入线程等待池中,等待被唤醒。