`

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多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    java多线程查询数据库

    综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。

    JAVA多线程练习题答案。

    JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

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

    Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...

    Java多线程下载器

    Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个部分并同时下载,显著提高了下载速度。在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O...

    Java 多线程 PPT

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    总之,Java多线程设计模式是每个Java开发者必备的技能之一。深入学习并熟练运用这些模式,将有助于你编写出更高效、稳定和易于扩展的多线程应用程序。这个PDF版教程和源代码集合是你学习多线程设计模式的理想资源,...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

    java多线程设计

    本知识点将深入探讨Java多线程设计以及如何利用“不可变对象”(immutable objects)来避免多线程环境中的非安全问题。 一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    java多线程之并发锁

    Java 多线程之并发锁 Java 中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在多线程编程中,线程间的同步是非常重要的,因为不同的线程可能会同时访问同一个共享资源,导致数据...

    java 多线程简易聊天 精简版

    Java多线程技术是编程领域中的重要概念,尤其在开发高效、并发的网络应用程序时,如简易聊天程序,它的应用尤为关键。在这个“java 多线程简易聊天 精简版”项目中,我们将深入探讨Java如何实现多线程环境下的客户端...

    java多线程进阶

    Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...

    Java多线程之龟兔赛跑

    在这个"Java多线程之龟兔赛跑"的例子中,我们看到了如何使用Java的Thread类来创建和管理线程,模拟经典的寓言故事——龟兔赛跑。 首先,我们创建了一个名为`WuguiThread`的类,它继承自`Thread`。这个类代表乌龟...

    java线程并发semaphore类示例

    在Java多线程编程中,线程的并发控制是非常关键的一部分,它确保多个线程能够协同工作并有效地访问共享资源。Java 5.0引入了四个新的同步工具类,它们是Semaphore、CountDownLatch、CyclicBarrier和Exchanger,用于...

Global site tag (gtag.js) - Google Analytics