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