`

Java多线程之Semaphore

 
阅读更多

    import java.util.ArrayList;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
    import java.util.concurrent.Semaphore;  
    import java.util.concurrent.locks.Lock;  
    import java.util.concurrent.locks.ReentrantLock;  
      
    /** 
     * Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是: 
     * Semaphore, CountDownLatch, CyclicBarrier和Exchanger. 
     * 本例主要介绍Semaphore。 
     * Semaphore是用来管理一个资源池的工具,可以看成是个通行证, 
     * 线程要想从资源池拿到资源必须先拿到通行证, 
     * 如果线程暂时拿不到通行证,线程就会被阻断进入等待状态。 
     */  
    public class SemaphoreTest {  
        /** 
         * 模拟资源池的类 
         * 只为池发放2个通行证,即同时只允许2个线程获得池中的资源。 
         */  
        public static class Pool {  
            // 保存资源池中的资源  
            ArrayList<String> pool = null;  
            // 通行证  
            Semaphore pass = null;  
            Lock lock = new ReentrantLock();  
            public Pool(int size) {  
                // 初始化资源池  
                pool = new ArrayList<String>();  
                for (int i = 0; i < size; i++) {  
                    pool.add("Resource " + i);  
                }  
                // 发放2个通行证  
                pass = new Semaphore(2);  
            }  
      
            public String get() throws InterruptedException {  
                // 获取通行证,只有得到通行证后才能得到资源  
                System.out.println("Try to get a pass...");  
                pass.acquire();  
                System.out.println("Got a pass");  
                return getResource();  
            }  
      
            public void put(String resource) {  
                // 归还通行证,并归还资源  
                System.out.println("Released a pass");  
                pass.release();  
                releaseResource(resource);  
            }  
      
            private String getResource() {  
                lock.lock();  
                String result = pool.remove(0);  
                System.out.println("资源 " + result + " 被取走");  
                lock.unlock();  
                return result;  
            }  
      
            private void releaseResource(String resource) {  
                lock.lock();  
                System.out.println("资源 " + resource + " 被归还");  
                pool.add(resource);  
                lock.unlock();  
            }   
        }  
          
        public static void testPool() {  
            // 准备10个资源的资源池  
            final Pool aPool = new Pool(10);  
            Runnable worker = new Runnable() {  
                public void run() {  
                    String resource = null;  
                    try {  
                        //取得resource  
                        resource = aPool.get();  
                        //用resource做工作  
                        System.out.println("I am working on " + resource);  
                        Thread.sleep(500);  
                        System.out.println("I finished on " + resource);  
                    } catch (InterruptedException ex) {  
                    }  
                    //归还resource  
                    aPool.put(resource);  
                }  
            };  
            // 启动5个任务  
            ExecutorService service = Executors.newCachedThreadPool();  
            for (int i = 0; i < 5; i++) {  
                service.submit(worker);  
            }  
            service.shutdown();  
        }   
          
        public static void main(String[] args) {  
            SemaphoreTest.testPool();  
        }  
    }  
分享到:
评论

相关推荐

    Java多线程Semaphore工具的使用详解.rar

    Java多线程Semaphore工具的使用详解.rar

    java线程并发semaphore类示例

    Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介绍Semaphore,Semaphore是用来管理一个资源池的工具,可以看成是个通行证

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA 多线程之信号量(Semaphore)实例详解

    主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下

    Java多线程之并发工具类

     1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)  2)CyclicBarrier(循环屏障:同步屏障)  3)Semaphore(信号量:控制并发进程数)  主要参考资料:java并发编程的艺术、Java并发——...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    2023年最新Java高并发多线程面试题

    适用人群:适合想了解或学习高并发多线程的 IT 学生、开发人员、研究人员以及使用Java多线程进行开发的任何人。 能学到什么:常见Java高并发多线程面试问题及在相关场景下如何处理和解决这些问题。 阅读建议:通过...

    详解java多线程的同步控制

    目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...

    92道Java多线程与并发面试题含答案(很全)

    Java并发编程的核心概念包括: 线程(Thread):线程是程序执行流的最小单元。...原子操作(Atomic Operations):原子操作是不可中断的操作,即在多线程环境中,这些操作要么完全执行,要么完全不执行。

    JAVA高质量并发详解,多线程并发深入讲解

    本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...

    Java信号量Semaphore

     Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。  Semaphore实现的功能类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...

    Java多线程同步器代码详解

    主要介绍了Java多线程同步器代码详解,文章分别介绍了是CountDownLatch,Semaphore,Barrier和Exchanger以及其相关代码示例,具有一定参考价值,需要的朋友可以了解下。

    带你看看Java的锁(二)-Semaphore

    Semaphore 中文称信号量,它和ReentrantLock 有所区别,ReentrantLock是排他的,也就是只能允许一个线程拥有资源,Semaphore是共享的,它允许多个线程同时拥有资源,是AQS中共享模式的实现,在前面的AQS分析文章中,...

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    Java并发之AQS详解 CountDownLatch CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程(这里不涉及)。 我们首先来看看怎么实现一个线程等待多个线程吧。 工厂中,对产品...

    多线程控制的三大安全类封装

    多线程控制的三大安全类:CountDownLatch、CyclicBarrier、Semaphore,这工具包将其封装,可以让初学者更容易学习以及让开发者更容易调用,不需要自己重新编写核心代码。具体事例在源码中。

    Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka

    『死磕Java并发编程系列』 01 十张图告诉你多线程那些破事 『死磕Java并发编程系列』 02 面试官:说说什么是Java内存模型? 『死磕Java并发编程系列』 03 面试必问的CAS原理你会了吗? 『死磕Java并发编程系列』 04 ...

Global site tag (gtag.js) - Google Analytics