Semaphore类
一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
获得一项前,每个线程必须从信号量获取许可,从而保证可以使用该项。该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用 acquire() 时无法保持同步锁定,因为这会阻止将项返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。
将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可,或零个可用的许可。按此方式使用时,二进制信号量具有某种属性(与很多 Lock 实现不同),即可以由线程释放“锁定”,而不是由所有者(因为信号量没有所有权的概念)。在某些专门的上下文(如死锁恢复)中这会很有用。
构造方法:
a. Semaphore(int permits):用给定的许可数和非公平的公平设置创建一个 Semaphore。
b. Semaphore(int permits, boolean fair):用给定的许可数和给定的公平设置创建一个 Semaphore。
实例:
package com.bijian.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class Main { /** * @param args */ public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 获取许可 semp.acquire(); System.out.println(Thread.currentThread().getName() + ": Accessing: " + NO); Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 访问完后,释放 semp.release(); System.out.println("-----------------" + semp.availablePermits()); } } }; exec.execute(run); } // 退出线程池 exec.shutdown(); } }
运行结果:
pool-1-thread-1: Accessing: 0 pool-1-thread-4: Accessing: 3 pool-1-thread-3: Accessing: 2 pool-1-thread-2: Accessing: 1 pool-1-thread-6: Accessing: 5 -----------------1 pool-1-thread-8: Accessing: 7 -----------------1 pool-1-thread-7: Accessing: 6 -----------------1 pool-1-thread-9: Accessing: 8 -----------------1 pool-1-thread-10: Accessing: 9 -----------------1 pool-1-thread-5: Accessing: 4 -----------------1 pool-1-thread-11: Accessing: 10 -----------------1 pool-1-thread-12: Accessing: 11 -----------------1 pool-1-thread-13: Accessing: 12 -----------------1 pool-1-thread-14: Accessing: 13 -----------------1 pool-1-thread-15: Accessing: 14 -----------------1 pool-1-thread-16: Accessing: 15 -----------------1 pool-1-thread-17: Accessing: 16 -----------------1 pool-1-thread-18: Accessing: 17 -----------------1 pool-1-thread-19: Accessing: 18 -----------------1 pool-1-thread-20: Accessing: 19 -----------------1 -----------------2 -----------------3 -----------------4 -----------------5
相关推荐
对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...
**JDK 1.5 for Windows** Java Development Kit (JDK) 1.5,也称为 Java 5.0,是Sun Microsystems开发的一个重要的Java平台版本。它在2004年9月30日正式发布,引入了许多新的特性和改进,对Java编程语言和Java...
9. **并发API(Concurrent APIs)**: JDK1.5加强了对多线程编程的支持,引入了并发工具类如`java.util.concurrent`包,包括`ExecutorService`、`Semaphore`、`CountDownLatch`等,以及`java.util.concurrent.atomic`...
《Java JDK1.5实例宝典》是一本深入解析JDK1.5版本中关键特性和类库的实践指南,涵盖了Java Mail、Servlet、JSP以及多线程等多个核心领域。这本书通过丰富的实例来帮助读者理解和掌握Java编程的精髓。 在JDK1.5中,...
10. **线程并发库**:JDK 1.5加强了对多线程编程的支持,提供了`java.util.concurrent`包,包含如`ExecutorService`、`Future`、`Semaphore`等工具类,使得并发编程更加高效和安全。 11. **二进制表示(二进制 ...
JDK 1.5增加了大量并发编程的工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,它们提供了更高效和安全的多线程处理方式。 **10. 遍历Map的键值对(For-Each Loop over Maps)*...
JDK 1.5引入了`java.util.concurrent`包,提供了许多高级并发工具,如`ExecutorService`、`Future`、`Callable`、`CyclicBarrier`、`Semaphore`等,大大简化了并发编程。 **线程池的概念** 线程池(ThreadPool)是...
10. **并发工具类(Concurrent Utility Classes)**: 新增了`java.util.concurrent`包,包含一系列线程安全的集合和并发工具,如`Executor`框架、`Future`、`Semaphore`等,提升了多线程编程的效率和安全性。...
Java JDK实例宝典源代码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现机制。这份源代码提供了丰富的示例,帮助开发者深入理解Java语言的使用和内部工作原理。通过研究这些实例,我们可以...
Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...
这本书详细对比了JDK 1.4和JDK 1.5之间的差异,帮助开发者理解不同版本下线程处理的进化与改进。 在Java编程中,线程是并发执行的程序片段,它使得一个应用程序可以在同一时间执行多个任务。Java提供了丰富的API来...
10. **并发库**:Java提供了丰富的并发工具类,如ExecutorService、Semaphore、CountDownLatch等,实例会展示如何高效地管理线程池和控制并发。 11. **Java IO/NIO**:NIO(New Input/Output)是Java的非阻塞I/O...
《Java JDK 实例宝典》是一本专注于JDK深度学习与实践的书籍,源码则提供了书中所有示例程序的实现,这对于Java开发者来说是一份宝贵的资源。在深入理解JDK的各种特性和功能时,通过实际操作这些源码,可以更直观地...
Java JDK实例开发宝典源代码是一份非常宝贵的资源,它涵盖了Java开发中的各种核心概念和技术。JDK(Java Development Kit)是Java编程的基础,包含了Java运行环境、编译器、调试器以及各种工具,是每个Java开发者...
《JDK实例开发宝典》是一本以Java JDK为中心,深度剖析其功能并提供大量实践示例的资源集合。这份压缩包中包含了丰富的源代码,旨在帮助开发者深入理解和运用Java JDK的各种工具和类库,从而提升开发效率和代码质量...
2. **枚举(Enums)**:JDK1.5引入,1.6继续完善,枚举类型为常量集合提供了一种强大的、类型安全的表示方式。枚举类型不能被实例化,有助于防止错误和提高代码质量。 3. **并发(Concurrency)**:1.6版本对并发库...
3. 方法引用来代替匿名内部类:在需要传递一个匿名内部类实例时,JDK 1.8允许直接使用方法引用来代替,简化了代码结构。 4. 新的日期和时间API:在java.time包下,JDK 1.8提供了新的日期和时间API,替代了旧有的...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
java.util.concurrent包包含了一系列并发工具,如Semaphore(信号量)、CyclicBarrier(循环栅栏)和ExecutorService(执行器服务),帮助开发者更高效、安全地进行多线程编程。 以上只是《JDK API 1.8_中文文档》...
3. **使用ExecutorService和Callable接口**:JDK 1.5引入的Executor框架允许更高级别的线程管理。Callable接口与Runnable类似,但可以返回结果。使用ExecutorService可以创建线程池,有效管理线程生命周期,提高性能...