总结三个方法:
(1)join方法,直接将每个线程都join进去即可。
(2)countdownlatch,内部维持一个计数操作,通过cas算法保证操作的原子性,当线程执行完之后,调用countDown()方法,将计数减一,主线程调用countdownlatch对象的await()方法,将当前线程挂起,直到countdownlatch对象的计数为0,主线程执行。
(3)类似屏障的东西,当子线程执行完之后,调用CyclicBarrier对象的await()方法,直到指定数量的线程到达屏障之后,才会继续执行主线程。把每一个子线程比作&&符号的一个条件,那么只有到所有条件都满足时,才会执行主线程。