debug模式下,观察多线程执行过程和状态
场景如下:在加锁的情况下,观察线程状态
public class DebugDemo {
// 锁
private Object lock = new Object();
// 执行方法 互斥
public void execute() {
synchronized (lock) {
String name = Thread.currentThread().getName();
System.out.println(name + " Hello World!");
}
}
// 启动3个线程,3个线程持有同一个DebugDemo对象
public static void main(String[] args) {
DebugDemo demo = new DebugDemo();
Thread t1 = new Thread(new Task(demo), "t1");
Thread t2 = new Thread(new Task(demo), "t2");
Thread t3 = new Thread(new Task(demo), "t3");
t1.start();
t2.start();
t3.start();
}
// 线程实体
static class Task implements Runnable {
private DebugDemo demo;
public Task(DebugDemo demo) {
this.demo = demo;
}
@Override
public void run() {
demo.execute();
}
}
}
打上断点,右键断点的位置打开设置,选择【Thread】再点击【Make Default】。
【All】:第一个线程到达这里,立马阻塞。
【Thread】:不同的线程可以并发到这里。因为加了锁,其他线程会是MONITOR状态。
debug模式运行程序,观察线程状态。
如图可见,线程t2抢到锁,处于RUNNING状态,t1和t3在等待t2释放锁资源
其他设置:比如在该断点,我们并不关心线程t1,t1可以通过此断点,其他线程需要触发断点,可以在设置界面这样配置