秒杀多线程第八篇 经典线程同步 信号量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)