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

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()。

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

你可能感兴趣的:(java)