• JDK 5.0 Concurrency Utilities 并发处理(4)Semaphore 信号量


    Semaphore 信号量





      1package com.vinko.test.concurrent;
      2
      3import java.util.Calendar;
      4import java.util.concurrent.Semaphore;
      5import java.util.concurrent.locks.Condition;
      6import java.util.concurrent.locks.Lock;
      7import java.util.concurrent.locks.ReentrantLock;
      8
      9public class TestSemaphore {
     10
     11    private ReentrantLock lock = null;
     12    private Condition condition = null;
     13    private Semaphore semaphore = null;
     14    
     15    public TestSemaphore() {
     16        lock = new ReentrantLock();
     17        condition = lock.newCondition();
     18        semaphore = new Semaphore(2true);
     19    }

     20    
     21    /**
     22     * @param args
     23     */

     24    public static void main(String[] args) {
     25
     26        TestSemaphore tester = new TestSemaphore();
     27        
     28        tester.test();
     29    }

     30    
     31    public Lock getLock() {
     32        return lock;
     33    }

     34    
     35    public Condition getCondition() {
     36        return condition;
     37    }

     38    
     39    public Semaphore getSemaphore() {
     40        return semaphore;
     41    }

     42    
     43    public void test() {
     44        try {
     45            /*
     46            semaphore.acquire();
     47            System.out.println("get semaphore");
     48            
     49            semaphore.acquire();
     50            System.out.println("get semaphore");
     51
     52            semaphore.release();
     53
     54            semaphore.acquire();
     55            System.out.println("get semaphore");
     56            
     57            semaphore.acquire();
     58            System.out.println("get semaphore");
     59            */

     60            
     61            new Thread(new TestThread(this)).start();
     62            new Thread(new TestThread(this)).start();
     63            new Thread(new TestThread(this)).start();
     64            new Thread(new TestThread(this)).start();
     65            
     66            Thread.sleep(3000);
     67            
     68            lock.lock();
     69            condition.signal();
     70//            condition.signal();
     71//            condition.signalAll();
     72            lock.unlock();
     73            
     74        }
     catch (InterruptedException e) {
     75            e.printStackTrace();
     76        }

     77    }

     78
     79}

     80
     81class TestThread implements Runnable {
     82    
     83    private TestSemaphore tester = null;
     84    
     85    public TestThread(TestSemaphore tester) {
     86        this.tester = tester;
     87    }

     88    
     89    public void run() {
     90        
     91        Calendar now = Calendar.getInstance();
     92        
     93        System.out.println(now.getTime() + " " + Thread.currentThread() + " started.");
     94
     95        while (true{
     96            try {
     97                tester.getLock().lock();
     98                tester.getCondition().await();
     99                tester.getLock().unlock();
    100                
    101                Calendar now1 = Calendar.getInstance();
    102                System.out.println(now1.getTime() + " " + Thread.currentThread() + " got signal.");
    103                
    104                tester.getSemaphore().acquire();
    105                
    106                Calendar now2 = Calendar.getInstance();
    107                System.out.println(now2.getTime() + " " + Thread.currentThread() + " got semaphore.");
    108                
    109//                tester.getSemaphore().release();
    110                
    111            }
     catch (InterruptedException e) {
    112                e.printStackTrace();
    113            }

    114        }

    115    }

    116}
  • 相关阅读:
    LockFree的栈实现及与加锁实现的性能对比
    redis源码笔记-redis.conf
    【ASP.NET】应用程序、页面和控件的生命周期
    【ASP.NET】HTTP客户请求的数据格式说明
    【ASP.NET】页面间传值
    【ASP.NET】Page.IsPostBack 属性
    【ASP.NET】互联网HTTP连接等出错代码大全
    【经验分享】抽象类、虚函数、接口、多态 概念与关系的理解
    【架构设计】需求分析
    【经验分享】常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/kylindai/p/322670.html
Copyright © 2020-2023  润新知