总结版
- 同个线程调两次start()会抛IllegalThreadStateException异常
- 使用reentrantLock这种显式锁,务必手动unlock。用sync锁就不用手动释放锁了
- 使用中断interrupt时,不要在sleep,wait,join时使用(自己没模拟出demo)
- 在线程sleep/wait /join时通知其interrupt,会抛出InterruptedException异常。要注意在catch异常时做中断恢复(即再对这个线程interrupt一遍)
文章目录
1. 同个线程调两次start()会抛IllegalThreadStateException异常
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("t1");
});
Thread t2 = new Thread(() -> {
System.out.println("t2");
});
t1.start();
t1.start(); // IllegalThreadStateException
}
2. 使用ReentrantLock这种显式锁,必须手动释放锁
(不然会死锁,其他的线程会一直被阻塞尝试加锁)。一般在finally释放锁,加锁要写在try之外(免得加锁时抛异常了然后锁被释放了,结果最后到了finally又释放一次锁嘛??有赞coder上看到的)
模拟忘记释放锁,结果预测:t11或t22任意一句会无法打印,且程序一直不结束
package com.example.juc.interrupt;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadInterrupt {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("t1");
lock.lock();
System.out.println("t11");
});
Thread t2 = new Thread(() -> {
System.out.println("t2");
lock.lock();
System.out.println("t22");
});
t1.start();
t2.start();
// 模拟忘记释放锁,结果预测:t11或t22任意一句会无法打印,且程序一直不结束
}
}
3. 使用中断interrupt时注意,不要在线程sleep/wait /join时使用。如果用了记得在catch异常时做中断恢复
相关文章:【Java多线程】wait()和join()被中断的过程
4. 使用Thread#wait、Thread#notify时要和synchronized搭配使用,否则会抛IllegalMonitorStateException
详见文档