目录
其中,如果不要那一句:Thread.sleep(1000);
先上代码:
public class test {
@SneakyThrows
@Test
public void blockedTest() {
Thread a = new Thread(new Runnable() {
@Override
public void run() {
testMethod();
}
}, "a");
Thread b = new Thread(new Runnable() {
@Override
public void run() {
testMethod();
}
}, "b");
a.start();
Thread.sleep(1000);//注意这句!
//a.join(); //这句会让主线程 堵塞在这里,知道a执行完毕了,才继续往下走
b.start();
System.out.println(a.getName() + ":" + a.getState()); // 输出?
System.out.println(b.getName() + ":" + b.getState()); // 输出?
}
// 同步⽅法争夺锁
private synchronized void testMethod() {
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
其中,如果不要那一句:Thread.sleep(1000);
该代码可能会输出以下两种结果之一:
结果 1: a:BLOCKED b:RUNNABLE
结果 2: a:RUNNABLE b:BLOCKED
因为:测试⽅法的main线程只保证了a,b两个线程调⽤start()⽅法(转化为RUNNABLE状态),还没等两个线程真正开始争夺锁,就已经打印此时两个线程的状态(RUNNABLE)了。所以要加一个 Thread.sleep(1000);