线程的生命周期
new(新建):线程创建
Runnable(就绪):没有抢到时间片
Running(运行):抢到了时间片,CPU开始处理这个线程中的任务
Blocked(阻塞):线程在执行过程中遇到特殊情况,使得其他线程就可以获得执行的机会,被阻塞的线程会等待合适的时机重新进入就绪状态
Dead(死亡):线程终止 a. run方法执行完成,线程正常结束 b. 直接调用该线程的stop方法强制终止这个线程
public class Demo3 {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
private static boolean flag = true;
private static Runnable r = new Runnable() {
@Override
public void run() {
while (true) {
if (flag) {
synchronized (obj1) {// 对象锁
System.out.println(Thread.currentThread().getName() + "获得第一个对象obj1");
flag = !flag;
// 第一个线程在此等侯obj2
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + "获得第二个对象obj2");
}
}
} else {
synchronized (obj2) {
// 第二个线程持有了obj2
System.out.println(Thread.currentThread().getName() + "获得第二个对象obj2");
flag = !flag;
// 第二个线程在此等侯obj1
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + "获得第一个对象obj2");
}
}
}
}
}
};
public static void main(String[] args) {
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t2.start();
t1.start();
}
}
前两个不用看,多次循环,出现死锁,后两个各自拿着对方所需要的,又不释放自己所拥有的,导致了死锁的出现。