美文网首页
Semaphore 信号量

Semaphore 信号量

作者: 笨笨哒2018 | 来源:发表于2018-08-23 14:34 被阅读0次

    Semaphore也叫信号量,在JDK1.5被引入,可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。
    Semaphore内部维护了一组虚拟的许可,许可的数量可以通过构造函数的参数指定。
    访问特定资源前,必须使用acquire方法获得许可,如果许可数量为0,该线程则一直阻塞,直到有可用许可。
    访问资源后,使用release释放许可。
    Semaphore和ReentrantLock类似,获取许可有公平策略和非公平许可策略,默认情况下使用非公平策略。

    使用实例

    public class SemaphoreTest {
        public static void main(String[] args) {
            ExecutorService service = Executors.newCachedThreadPool();
     
            final Semaphore sp = new Semaphore(3);
            for (int i = 0; i < 10; i++) {
                Runnable runnable = new Runnable() {
                    public void run() {
                        try {
                            sp.acquire();
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                        System.out.println("Thread: "
                                + Thread.currentThread().getName()
                                + " gets in,we now have "
                                + (3 - sp.availablePermits()) + " concurrent");
                        try {
                            Thread.sleep((long) (Math.random() * 10000));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("Thread: "
                                + Thread.currentThread().getName() + " is leaving");
                        sp.release();
                    }
                };
                service.execute(runnable);
            }
            service.shutdown();
        }
     
    }
    
    

    相关文章

      网友评论

          本文标题:Semaphore 信号量

          本文链接:https://www.haomeiwen.com/subject/gdzpiftx.html