线程池等待问题
再使用线程池的时候,使用拒接策略可能会有些数据没执行,但是这些数据不应该少所以没办法就只能循环等待,直到出现空位再执行,不知道各位大佬有没有什么好方法。
我这里是直接使用信号量,判断有没有再等待的
Semaphore semaphore = new Semaphore(3);//信号量
int a = 0;
for (Map<String, Object> map : list) {
a = 0;
// 最多等10分钟 semaphore.hasQueuedThreads() 判断有没有已经再等待的
while (semaphore.hasQueuedThreads() && a < 10) {
Thread.sleep(1000*60);
a++;
}
Stone.getThreadPoolExecutor().execute(()->{
try {
// 获取,假设如果已经满了,等待,等待被释放为止
semaphore.acquire();
Thread.sleep(1000*10*60);//执行
}catch (Exception e) {
e.printStackTrace();
}finally {
semaphore.release();
}
});
}
}
管理单个线程的阻塞和唤醒可以使用LockSupport 比信号量更加方便
LockSupport.park(currentThread);//线程是否许可,未许可则不可用 阻塞
LockSupport.unpark(currentThread);//线程设置为许可状态;