主线程
public static ExecutorService washPool;
{
//初始化线程池 300个线程
washPool = Executors.newFixedThreadPool(300);
}
//设置静态变量 Semaphore 许可证数量为线程池大小
private static final Semaphore sp = new Semaphore(300);
//循环开启300个线程
for (int i = 0; i<300 ;i++) {
MyThread myThread= new MyThread (sp);
washPool.execute(myThread);
}
自定义线程
//线程重写run方法 在线程开始时获取许可,线程结束时 释放许可
@Override
public void run() {
try {
sp.acquire();//获取许可
do something();
.......
} catch (InterruptedException e) {
e.printStackTrace();
}
sp.release(); //释放许可
}
主线程
//主线程中监听sp
//当Semaphore的可用许可不达到300时,说明仍有线程在工作 ,当前线程休眠10s
//sp.availablePermits() 获取可用许可数量
while (sp.availablePermits() !=300){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace在这里插入代码片();
}
}
//执行到这,说明线程池的工作线程为零,任务已全部完成
do something();
该博客介绍了如何利用固定大小的线程池和Semaphore进行线程同步。通过创建300个线程并设置Semaphore许可数为300,确保每个线程开始时获取许可,结束后释放,主线程通过监听Semaphore的可用许可来判断任务是否完成。
423

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



