多线程:Java⾥的所有线程都全部执⾏完毕后,代码再往下继续执⾏的控制⽅
法(CountDo。。。
在Java的多线程中,有的时候我们需要等某些多线程的⽅法全部都执⾏完毕后,才继续往下执⾏。这个该怎么控制呢?⽤CountDownLatch类。这个类是urrent包⾥⾯,也即是Java的并发⼯具包,这个包⾥⾯有很多多线程的⼯具类,在多线程编程中很有⽤。
下⾯就是⼀个CountDownLatch类的⼀个⽤法。⽐如我们有五个⼈(五个线程),他们都赶往同⼀⽬的地,但是我们不知道他们什么时候才能赶来,或许1秒,或许9秒,或许更长。然后我们接下来的事情需要五个⼈都到齐了才能继续往下做。这就需要进⾏多线程控制。
在Java语⾔⾥,也就是有N个线程,我们接下来要多线程调度这N个线程,然后这N个线程都全部执⾏完毕后,代码才接着往下执⾏。应⽤场景已经说明,接下来我们⽤⼀个例⼦来说明CountDownLatch是如何控制代码等多个线程执⾏完毕后才继续往下执⾏。假设我们有五个线程并发执⾏,我们通知了他们,然后他们多线程执⾏。等到他们都执⾏完了,⼜接着往下做。以下⽰例代码可以作为参考。读者可以复制代码到⾃⼰的IDE进⾏调试运⾏:
import java.util.Random;
import urrent.CountDownLatch;
/**
* 多个线程都全部执⾏完毕后,再往下执⾏
* @Author: LiYang
* @Date: 2019/9/10 19:53
*/
public class WaitForUs {
/**
* 多线程⼯具类CountDownLatch的⼀个⽤法⽰例
* @param args
*/
public static void main(String[] args) {
//执⾏多线程之前的代码,本例中就是通知⼤家到⽬的地
System.out.println("通知,⼤家快来这个地⽅");
System.out.println("=========== 可以理解为多线程之前 ===========");
//总的线程数为5(⼤家可以换这个变量,进⾏调试)
int threadNum = 5;
//创建⼀个CountDownLatch类,构造⼊参线程数
CountDownLatch countDownLatch = new CountDownLatch(threadNum);
//创建5个线程,并发同步执⾏
for (int i = 0; i < threadNum; i++) {
new Thread(new Runnable() {
@Override
public void run() {
//10000以内的随机数,作为等待时间
int waitMillis = new Random().nextInt(10000);
try {
//模拟线程执⾏,耗费⼀定的时间(本例是10秒内)
Thread.sleep(waitMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
//线程执⾏完毕,报告结果
System.out.println(Thread.currentThread().getName() + "已到达⽬的地,所⽤毫秒数:" + waitMillis);
//CountDownLatch类计数减⼀
//注意,CountDownLatch类的实例要在新建多线程之前,然后⼊参需要
//统⼀完成后才往下执⾏的线程数。然后每个线程执⾏完后,或者
//部分执⾏完后,调⽤之前创建的CountDownLatch类的实例的countDown⽅法
}
}).start();
}
try {
/
/下⾯这句代码,CountDownLatch就阻塞在这⾥了
nextint()方法//直到countDown()到0了(从构造⼊参的线程数开始减)
//也即是所有线程都countDown了,
//则解除阻塞,代码继续往下执⾏
//注意,这句代码放在多线程countDown之后,多线程全部完成后
//继续往下执⾏的代码之前,起⼀个分界线的作⽤
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//由于CountDownLatch发挥的作⽤,等到上⾯的5个线程都执⾏完毕了,
/
/也就是都打印了"已到达⽬的地",接下来才会往下执⾏,打印下⾯这句话
System.out.println("=========== 可以理解为多线程之后 ===========");
System.out.println("⼤家都到齐了,那就开始吧");
}
}
运⾏程序,控制台输出以下内容,完全符合我们的预期,多线程得到了很好的控制:
通知,⼤家快来这个地⽅
=========== 可以理解为多线程之前 ===========
Thread-0已到达⽬的地,所⽤毫秒数:2060
Thread-2已到达⽬的地,所⽤毫秒数:3080
Thread-3已到达⽬的地,所⽤毫秒数:4757
Thread-4已到达⽬的地,所⽤毫秒数:7331
Thread-1已到达⽬的地,所⽤毫秒数:7643
=========== 可以理解为多线程之后 ===========
⼤家都到齐了,那就开始吧