Semaphore也是一个线程同步的辅助类,可以限制当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。
示例代码
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import static java.util.concurrent.TimeUnit.MICROSECONDS;
@SpringBootTest(classes = GoodsApplication.class)
@RunWith(SpringRunner.class)
public class TestIdWorker {
@Autowired
private SpuMapper spuMapper;
//J.U.C并发编程 限制访问线程数量
private final static Semaphore semaphore = new Semaphore(1);
@Test
public void testCyclicBarrier() throws Exception{
//J.U.C并发编程 栅栏机制
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for (int i = 0; i < 5; i++) {
new Thread(()->{
try {
System.out.println("我已经进来啦,查询商品");
cyclicBarrier.await(); //等待,栅栏拦住线程,等待栅栏开启,2000线程执行此段代码
Spu spu = findById("1335518444044419072");
if (spu!=null){
System.out.println("已经查到商品啦,商品名"+spu.getName());
}
}catch (Exception e){
e.printStackTrace();
}
}).start();
}
System.in.read(); //不关闭程序
}
Spu findById(String id) throws Exception{
try {
boolean b = semaphore.tryAcquire(3000, MICROSECONDS); //等待,如果三毫秒内没有拿到令牌,返回false
if (b == false){
System.out.println("很遗憾,没拿到令牌");
return null;
}
Spu spu = spuMapper.selectByPrimaryKey(id);
return spu;
}finally {
semaphore.release();
}
}
}
原文:https://www.cnblogs.com/ykpkris/p/14202976.html