操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java
并发库
的Semaphore
可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。
下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。
package
concurrent;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.Semaphore;
public class
TestSemaphore
{
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
(
"Accessing: "
+ NO
)
;
Thread.sleep
((
long
) (
Math.random
()
*
10000
))
;
// 访问完后,释放
semp.release
()
;
}
catch
(
InterruptedException e
) {
}
}
}
;
exec.execute
(
run
)
;
}
// 退出线程池
exec.shutdown
()
;
}
}
|
运行结果:
Accessing: 0
Accessing: 1
Accessing: 2
Accessing: 3
Accessing: 4
Accessing: 5
Accessing: 6
Accessing: 7
Accessing: 8
Accessing: 9
Accessing: 10
Accessing: 11
Accessing: 12
Accessing: 13
Accessing: 14
Accessing: 15
Accessing: 16
Accessing: 17
Accessing: 18
Accessing: 19
分享到:
相关推荐
5. **并发工具类库**:Java并发工具包(java.util.concurrent)在1.6版本中得到加强,增加了如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等同步工具,便于多线程编程。 6. **XPath和XML处理**:JDK 1.6改进了...
backport-util-concurrent-3.1.jar是一个Java库,它提供了一些并发工具类,用于简化多线程编程。这个库包含了许多实用的工具类,如`FutureTask`、`CountDownLatch`、`Semaphore`等,这些工具类可以帮助开发者更好地...
此外,1.6版本还增强了并发处理能力,引入了并发工具类(java.util.concurrent),如Semaphore、CountDownLatch等,为多线程编程提供了便利。 接下来是JDK API 1.8,这个版本引入了Lambda表达式和函数式接口,极大...
9. **并发编程改进(Concurrency Enhancements)**:引入了`java.util.concurrent`包,包含了许多线程安全的数据结构和并发工具类,如`Executor`框架、`Future`接口以及`Semaphore`、`CyclicBarrier`等同步工具。...
`java.lang.Thread`类和`java.util.concurrent`包提供了线程创建、同步和并发控制的工具,如`synchronized`关键字、`Semaphore`、`ExecutorService`等。 ### 七、模块系统 Java 9引入了模块系统,通过`java.module...
这个库使得开发者在不支持Java 5新特性的环境中也能使用高级的并发控制机制,极大地提升了多线程编程的效率和可靠性。本文将深入探讨backport-util-concurrent的源码,揭示其核心设计理念与实现原理。 首先,...
- **java.concurrent**:在JDK1.5引入,提供了并发控制、线程池、同步容器和并发集合等高级并发工具,如ExecutorService、Semaphore、Future、BlockingQueue等。 4. **反射与注解** - **java.lang.reflect**:...
- **java.util.concurrent** 包:提供了高级并发工具,如ExecutorService、Semaphore、CountDownLatch等,便于进行并发编程。 4. **网络编程** - **java.net** 包:包含了Socket、ServerSocket、URL等类,支持TCP...
- **java.util.concurrent**:提供高级并发工具类,如ExecutorService、Future、Semaphore等,方便多线程编程。 - **java.lang.Thread**:管理和控制线程的基本类,包括线程的创建、启动、同步和中断。 4. **反射...
Java并发编程包(java.util.concurrent,简称JUC)封装了大量用于高并发编程的工具类和接口,其中涉及了线程池、阻塞队列、同步器、原子操作类等。在并发环境下,可以有效降低线程创建和管理的复杂性。 #### Java...
Java 11是Java开发平台的一个重要版本,它在2018年9月发布,引入了许多新特性和改进。这个“jdk-11.0.5_doc-all.zip”压缩包包含了Java 11的完整英文API文档,是开发者理解和使用Java 11 API的关键资源。API...
`Thread`类允许创建和管理线程,而`java.util.concurrent`包提供了一套高效的并发工具,如`ExecutorService`、`Semaphore`和`CountDownLatch`,有助于简化多线程环境下的同步和协调。 4. **网络编程**:`java.net`...
5. **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了多线程编程的工具,如`Runnable`、`ExecutorService`、`Semaphore`等。 6. **异常处理**:`java.lang.Throwable`和其子类如`Exception`、`Error...
3. **并发工具包(Concurrent Package)**: JDK 1.6对并发编程的支持进一步增强,提供了丰富的并发工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,方便开发者进行高效的多线程...
- **java.util.concurrent**: 提供了高级并发工具,如ExecutorService、Future、Semaphore等,简化了多线程编程。 4. **I/O与NIO** - **传统I/O**: 基于流的I/O模型,如FileInputStream和FileOutputStream。 - *...
`CompletableFuture`是JDK1.8引入的新特性,用于处理异步计算,可以组合多个异步任务并处理结果。 ### 六、反射API `java.lang.reflect`包提供了反射API,允许程序在运行时动态访问和修改类、接口、字段和方法。...
首先,Java JDK 1.8是Java编程语言的一个关键版本,引入了许多新的特性和改进。其中最著名的当属Lambda表达式,这是一种简洁的函数式编程语法,使得处理集合数据变得更加高效。另外,Java 8还引入了Stream API,它...
标签 "源码" 提示我们可能会涉及Java并发库的底层实现,例如分析`java.util.concurrent`包中的类,如`ExecutorService`, `Semaphore`, `BlockingQueue`, `CountDownLatch`等的源代码。这些类在处理线程间通信、任务...
JDK 1.5增加了大量并发编程的工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,它们提供了更高效和安全的多线程处理方式。 **10. 遍历Map的键值对(For-Each Loop over Maps)*...
7. **内建的并发工具类**:JDK 5.0引入了`java.util.concurrent`包,包含了许多线程安全的数据结构和并发工具,如`ExecutorService`、`Semaphore`、`Future`等,极大地简化了多线程编程。 8. **NIO.2(New I/O API...