一,假如让你设计多个窗口同时卖票,保证只能三个人同时购买,买完票离开后其他人才能购买,怎么实现呢?
二,根据需求分析可知,我们要设计三个线程来实现同时卖票,这时我们可以使用Semaphore来控制并发数。
三,我们先设计一个多线程类,传入semaphore和同时购票的人数,提供相应的构造器,实现runnable接口重新run方法,
使用semaphore的require方法开启阻塞,执行完代码后用release方法来释放资源,达到线程运行完后其他线程才能进来,代码:
public class Myrunable implements Runnable{
private Semaphore semaphore;//并发数
private int user;//人数
//并发数,人数
public Myrunable (Semaphore semaphore ,int user){
this.semaphore = semaphore;
this.user =user;
}
@Override
public void run() {
try {
semaphore.acquire();//阻塞点
System.out.println("用户"+user+"进来购票");
Thread.sleep(100);
System.out.println("用户"+user+"购票成功");
Thread.sleep(100);
System.out.println("用户"+user+"离开窗口");
semaphore.release();//释放资源
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
四,测试类,编写buyPiao方法,创建semaphore对象,使用executors创建线程池,for循环里开启线程,传入我们创建的接口,模拟多个人排队买票
public class SemaphoreDemo {
public static void main(String[] args) {
SemaphoreDemo semaphoreDemo = new SemaphoreDemo();
semaphoreDemo.buyPiao();
}
public void buyPiao(){
//控制并发数,保证同一时间只能有3个人占有窗口
final Semaphore s = new Semaphore(3);
ExecutorService executorService = Executors.newCachedThreadPool();
//模拟20个人购票
for (int i=1;i<=20;i++){
executorService.execute(new Myrunable(s,i));
}
executorService.shutdown();
}
}
|
|