场景: 两个线程都需要执行同一个任务(Runnable),先让其中一个执行,拿到锁后睡五秒。紧接着 第二个线程开始执行,等第二个开始执行3秒后,打断(这是第二个线程肯定还未拿到锁)
表现:
lockInterruptibly:thread2立即响应中断抛出异常
lock和synchronized: thread2一直尝试拿到锁后才响应中断
测试用例:
lockInterruptily/ lock
static class Task implements Runnable {
@Override
public void run() {
try {
lock.lockInterruptibly();
// lock.lock()
System.out.println(Thread.currentThread().getId() + "come");
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getId() + "over");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
synchronized
private static Object object = new Object();
static class Task implements Runnable {
@Override
public void run() {
synchronized(object) {
try {
System.out.println(Thread.currentThread().getId() + "come");
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getId() + "over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
main:
Task task = new Task();
Thread t1 = new Thread(task);
t1.start();
TimeUnit.MILLISECONDS.sleep(300);
Thread t2 = new Thread(task);
t2.start();
TimeUnit.SECONDS.sleep(3);
System.out.println("执行打断");
t2.interrupt();
如果是打断已拿到锁的线程的话,三者均直接立即响应中断
Task task = new Task();
Thread t1 = new Thread(task);
t1.start();
TimeUnit.SECONDS.sleep(3);
System.out.println("执行打断");
t1.interrupt();