首页 > 代码库 > 秒杀多线程第八篇 经典线程同步 信号量Semaphore (续)
秒杀多线程第八篇 经典线程同步 信号量Semaphore (续)
java semaphore实现:
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
package com.multithread.semaphore;import java.util.concurrent.Semaphore;import com.multithread.main.ExampleInterface;/** * semaphore 可以控制某个资源被同时使用的个数。 * 通过 acquire()获得许可,没有就等待。 * release() 释放一个许可。 * * */public class SemaphoreExample extends ExampleInterface{ final Semaphore sema = new Semaphore(1); int g_num = 0; @Override public void startDemo() { for(int i=0;i<10;i++) { Thread se = new SemaMultiThread(i,sema); se.start(); } } @Override public void startDemo2() { final Semaphore _lsema = new Semaphore(10); for(int i=0;i<50;i++) { Thread se = new SemaMultiThread(i,_lsema); se.start(); } } class SemaMultiThread extends Thread { int index = -1; Semaphore mSema = null; public SemaMultiThread(int i,Semaphore se) { this.index = i; mSema = se; } @Override public void run() { try { mSema.acquire(); System.out.println("index:"+this.index); Thread.sleep((long) (Math.random()*100)); mSema.release(); System.out.println("----------------:"+mSema.availablePermits()); Thread.sleep((long) (Math.random()*100)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
可以使每个线程互斥: final Semaphore sema = new Semaphore(1);
Semaphore _lsema = new Semaphore(10); 同时有最大10个线程在运行,与线程池的效果类似!
秒杀多线程第八篇 经典线程同步 信号量Semaphore (续)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。