A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一,假如让你设计多个窗口同时卖票,保证只能三个人同时购买,买完票离开后其他人才能购买,怎么实现呢?
二,根据需求分析可知,我们要设计三个线程来实现同时卖票,这时我们可以使用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()
;
    }

}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马