java并发包里的semaphore的用法
博客专区 > 汪林 的博客 > 博客详情
java并发包里的semaphore的用法
汪林 发表于4年前
java并发包里的semaphore的用法
  • 发表于 4年前
  • 阅读 147
  • 收藏 9
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

摘要: java.util.concurrent包里的semaphore,jdk里解释为计数信号量,这个听起来有些晦涩,现在我们姑且把它理解为信号灯吧。 日常生活中,我们可能经常会做火车,当我们想上厕所的时候,我们通常会看一下车厢与车厢之间的门上有个信号灯,如果那个信号灯是红的,则厕所里有人;否则,厕所里没人。所以,现在我们就把这个semaphore理解为厕所上面那个信号灯吧。

当然,火车上厕所里只有一个坑,只允许一个人进去。然而在笔者的童年时代都是一厕多坑的。

那么我们现在想象一下,如果一个厕所有4个坑,但是现在10个人上厕所,笔者就想在厕所门口挂4个灯,每进去一个人都要取走一盏灯进去,出来的时候,再把灯重新挂在厕所门口。这样,世界瞬间变的美好了。

代码:

package com.core.semaphore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
 public static void main(String[] args) {
  
  //10上厕所的人
  final ExecutorService execu = Executors.newFixedThreadPool(10);
  
  //只有四个坑,我把厕所门口放4个信号灯
  final Semaphore s = new Semaphore(4);
  
  //模拟10个人上厕所,但是厕所里只有4个坑,只能容纳4个同时在里面
  for(int i=0;i<10;i++){
   final int NO=i+1;
   
   Runnable run = new Runnable() {
    
    @Override
    public void run() {
     try {
      
      //拿到信号灯
      s.acquire();
      
      System.out.println("线程:"+NO+"来了。。。");
      Thread.sleep((long) (Math.random()*10000));
      
      //拉完了,把信号灯重新挂在厕所门口
      System.out.println("线程:"+NO+"拉完了。。。");
      s.release();
      
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   };
   
   execu.execute(run);
  }
  
  execu.shutdown();
 }
}

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 7
博文 11
码字总数 8847
×
汪林
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: