我们知道, 线程如果不控制的话, 是异步与主线程执行的, 但是在开发过程中, 有时候我们需要主线程等待子线程任务执行完后, 再来执行主线程,那么一般通过 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 = Executors.newFixedThreadPool(THREAD_SIZE);
private Semaphore semaphore;
public ThreadSemaphore(){
//初始化, 这里为什么要是负数, 是因为不让有空闲

本文介绍了如何利用Semaphore来实现主线程等待所有子线程执行完毕后再继续执行。Semaphore作为计数器,当计数器为0时,线程会阻塞,子线程完成任务释放信号量后,主线程得以唤醒并继续执行。
最低0.47元/天 解锁文章
798

被折叠的 条评论
为什么被折叠?



