黑马程序员技术交流社区

标题: 【广州校区】+【原创】+ Semaphore模拟多个窗口同时售票 [打印本页]

作者: jianhong    时间: 2019-1-15 14:53
标题: 【广州校区】+【原创】+ Semaphore模拟多个窗口同时售票
一,假如让你设计多个窗口同时卖票,保证只能三个人同时购买,买完票离开后其他人才能购买,怎么实现呢?
二,根据需求分析可知,我们要设计三个线程来实现同时卖票,这时我们可以使用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()
;
    }

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2