@RequestMapping(value = "/getThread", method = RequestMethod.GET)
@ResponseBody
public String getData(){
CountDownLatch latch = new CountDownLatch(4);
new Thread(() -> {
try {
//第一个线程被阻塞
String name = Thread.currentThread().getName();
System.out.println("线程名称为:" + name);
latch.await();
if ("Thread-0".equals(Thread.currentThread().getName())) {
System.out.println("线程名称Thread-0唤醒成功!!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println("其他线程等待");
}).start();
for (int i = 0; i < 4; i++) {
try {
Thread.sleep(2000);
new Thread(() -> {
//其他线程执行countDown(),当count值减少到0,上边等待的线程将被释放
System.out.println(Thread.currentThread().getName());
latch.countDown();
}).start();
String name = Thread.currentThread().getName();
System.out.println("线程名称为=====:" + name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("hhaahhahhah" + Thread.currentThread().getName());
//main方法时主线程挂了后其他线程也就停止了,不执行了。所以为了唤醒Thread-0后不挂。
// try {
// Thread.sleep(10000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
return "success";
}
如果写的是main方法的话,一个阻塞线程在唤醒后,可能main线程已经挂掉了,一旦main线程挂掉其他线程就随之挂掉了。所以上面代码最后要加Thread.sleep(10000);,等待释放线程执行完 latch.await()后面的if条件后main在挂。这个一定注意!!