主线程
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();