zoukankan      html  css  js  c++  java
  • 秒杀多线程第八篇 经典线程同步 信号量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个线程在运行,与线程池的效果类似!
  • 相关阅读:
    easyui学习笔记1—增删改操作
    sql点滴37—mysql中的错误Data too long for column '' at row 1
    javascript获取当前url
    escape()、encodeURI()、encodeURIComponent()区别详解
    js文本框提示和自动完成
    javascript js string.Format()收集
    超链接标签为什么会造成页面颤抖
    asp.net mvc 4.0常见的几个问题
    如何使用Flashfxp上传下载文件
    点击按钮显示谷歌地图
  • 原文地址:https://www.cnblogs.com/deman/p/4076463.html
Copyright © 2011-2022 走看看