第十天 补充学习 线程池和信号量的使用

Semaphore简介

  • Semaphore是一个计数信号量,它的本质是一个"共享锁"。

  • 信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。

    public class MyRunnable implements  Runnable{
        private Semaphore semaphore;
        private int user;
        public MyRunnable(Semaphore semaphore, int user) {
            this.semaphore = semaphore;
            this.user = user;
        }
    
        public MyRunnable() {
        }
    
        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println("用户"+user+"进入窗口");
                Thread.sleep((long)Math.random()*10000);
                System.out.println("用户"+user+"买票完成,即将离开");
                Thread.sleep((long)Math.random()*10000);
                System.out.println("用户"+user+"已经离开");
                semaphore.release();
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
  • public class Demo {
        public static void main(String[] args) {
            executeTask();
        }
    
        public static void executeTask(){
            final Semaphore s = new Semaphore(2);
            ExecutorService threadPool = Executors.newCachedThreadPool();
    
            for (int i = 0; i <20 ; i++) {
                threadPool.execute(new MyRunnable(s,i+1));
    
            }
            threadPool.shutdown();
        }
    }
    
  • 信号量当做实现了Runnable接口自类的参数

  • 主要的两个方法acquire() 和 release()。

  • 和线程池搭配,控制每次执行线程的个数。(控制了多线程并发的数量)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值