我们知道, 线程如果不控制的话, 是异步与主线程执行的, 但是在开发过程中, 有时候我们需要主线程等待子线程任务执行完后, 再来执行主线程,那么一般通过 java.util.concurrent.Future、java.util.concurrent.CountDownLatch, 今天我给大家讲解另外一种方法, 采用 Semaphore 控制, Semaphore 维护的是一个计数器, 如果计数器值小于等于0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,当计数器的值大于0时,之前进入休眠的线程将被唤醒并再次试图获得信号量, 所以我们只要控制主线程堵塞, 在子线程释放许可证,等待一个可用的许可证时, 唤醒主线程。
package com.cnq.java.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* Semaphore 控制主线程等待子线程执行完成后再执行主线程
* 等待子线程执行完毕后,再执行主线程的方法还有: java.util.concurrent.Future、java.util.concurrent.CountDownLatch
* @author chenn
*
*/
public class ThreadSemaphore {
//定义线程数量
private static int THREAD_SIZE = 10;
//初始化线程池
private static ExecutorService executorService = Execu