教程集 www.jiaochengji.com
教程集 >  脚本编程  >  java  >  正文 Java 信号量 Semaphore使用方法详解

Java 信号量 Semaphore使用方法详解

发布时间:2016-10-20   编辑:jiaochengji.com
教程集为您提供Java 信号量 Semaphore使用方法详解等资源,欢迎您收藏本站,我们将为您提供最新的Java 信号量 Semaphore使用方法详解资源
Semaphore, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量,下面我们来看看Java 信号量 Semaphore使用方法


在用Semaphore 信号量的时候,感觉对公平调度比较有用,可以控制多线程争夺资源时候,最大可以几个在执行,随手写了代码测试下,如下:

说明:

1. acquire() 获取一个许可,如果没有就等待
2. release() 释放一个许可
3. Semaphore可以控制某个资源可被同时访问的个数,自行初始化的数量,为1当然就顺序执行了


package com.i5a6.semp.test;
 
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
 
public class SemaphoreTest {
 
 private Semaphore semp;
 
 private ExecutorService executorPool;
 
 public SemaphoreTest(int threadNum) {
  semp = new Semaphore(threadNum);
  executorPool = Executors.newFixedThreadPool(threadNum);
 }
 
 public void doEnd() {
  this.executorPool.shutdown();
 }
 
 public void doMsg(int num) {
  try {
   semp.acquire();
   executorPool.execute(new HelloUExecutor(num));
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 
 class HelloUExecutor implements Runnable {
  private int num;
 
  public HelloUExecutor(int num) {
   this.num = num;
  }
 
  Random r = new Random();
 
  @Override
  public void run() {
   try {
    System.out.println(num);
    Thread.sleep(r.nextInt(1000));
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    semp.release();
   }
  }
 }
 
 public static void main(String[] args) {
  // 初始化为1 顺序执行
  SemaphoreTest st = new SemaphoreTest(5);
  for (int i = 0; i < 20; i ) {
   st.doMsg(i);
  }
  st.doEnd();
 }
 
}

您可能感兴趣的文章:
Java 信号量 Semaphore使用方法详解
Go WaitGroup实现原理
经典Java线程面试题70道
Golang sync.WaitGroup源码详细分析
关于PHP你可能不知道的-PHP的事件驱动化设计
Java并发控制机制学习笔记
聊聊并发,进程通信方式,go协程简单应用场景
classpath详解(谨献给那些找不到北的朋友)
golang sdk后端怎么用_Golang资深后端工程师需要了解的知识点
python与java用途区别有哪些

[关闭]
~ ~