• 信号量多-threaded同步Semaphore


    Semaphore它是JDK1.5一个实现后,外面有个办法同步。Semaphore能够保持其当前的线程接入号码。并提供了一个同步机制。

    采用Semaphore时,可以用相同的对资源的访问进行控制的线程数。如果你有3资源,有着10要使用该资源的线程,同一时间只能有3使用线程。余7线程在等待,仅仅要3个中随意一个释放资源,那么7个线程中的一个就能够使用了。

         另外。7个线程等待能够使随机获取机会,也能够是依照先来后到的顺序获得机会,这取决与Semaphore的构造时传入的參数。

       单个信号量的Semaphore对象能够实现相互排斥锁的功能,而且能够是有一个线程获得了锁,再有还有一个线程去释放改锁,能够实现死锁恢复。

    构造方法摘要
    Semaphore(int permits)
              创建具有给定的许可数和非公平的公平设置的 Semaphore

    Semaphore(int permits, boolean fair)

              创建具有给定的许可数和给定的公平设置的 Semaphore


    详细实现例如以下:

    package andy.thread.test;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    /**
     * @author Zhang,Tianyou
     * @version 2014年11月9日 下午1:49:25
     */
    
    public class ThreadSemaphoreTest {
    
    	public static void main(String[] args) {
    		// 定义一个缓存线程池
    		ExecutorService threadPool = Executors.newCachedThreadPool();
    		final int MAX_AVAILABLE = 100;
    		// 定义信号量 等待线程使用公平原则 先来后到
    		Semaphore semaphore = new Semaphore(MAX_AVAILABLE, true);
    		for (int i = 0; i < 10; i++) {
    			Runnable runnable = new Runnable() {
    
    				@Override
    				public void run() {
    					// TODO Auto-generated method stub
    					try {
    						// 此信号量获取一个许可。在提供一个许可前一直将线程堵塞,否则线程被中断。

    semaphore.acquire(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // availablePermits() 返回此信号量中当前可用的许可数。

    System.out .println("线程" + Thread.currentThread().getName() + "进入,当前已有" + (MAX_AVAILABLE - semaphore.availablePermits() + "个并发")); try { Thread.sleep((long) (Math.random() * 10000)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + "即将离开"); // 释放一个许可。将其返回等待线程给信号量。

    semaphore.release(); } }; threadPool.execute(runnable); } } }


    执行效果例如以下:

    线程pool-1-thread-1进入,当前已有1个并发
    线程pool-1-thread-3进入,当前已有2个并发
    线程pool-1-thread-2进入。当前已有3个并发
    线程pool-1-thread-5进入,当前已有4个并发
    线程pool-1-thread-7进入,当前已有5个并发
    线程pool-1-thread-4进入。当前已有6个并发
    线程pool-1-thread-6进入,当前已有7个并发
    线程pool-1-thread-8进入,当前已有8个并发
    线程pool-1-thread-9进入。当前已有9个并发
    线程pool-1-thread-10进入。当前已有10个并发
    线程pool-1-thread-5即将离开
    线程pool-1-thread-3即将离开
    线程pool-1-thread-6即将离开
    线程pool-1-thread-7即将离开
    线程pool-1-thread-2即将离开
    线程pool-1-thread-8即将离开
    线程pool-1-thread-9即将离开
    线程pool-1-thread-10即将离开
    线程pool-1-thread-1即将离开
    线程pool-1-thread-4即将离开
    



    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    使用RazorGenerator对视图View进行单元测试
    C#常用获取本周、本月、本季度、本年的时间起止段代码
    Redis使用记录
    Git和ConEmu
    mongodb单索引的升序和降序
    AES 加密解密 php c#
    redis 外网连接错误
    .net mvc 分页
    检查Windows上安装的.net版本
    sqlserver跨服务器查询
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4798914.html
Copyright © 2020-2023  润新知