`

JDK1.5 Semaphore实例

阅读更多

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 windows 64位官方正式版,绝对有效

    对于并发编程,JDK1.5引入了java.util.concurrent包,其中包括了线程池、Future、Callable接口以及CyclicBarrier和Semaphore等同步工具类,极大地丰富了并发处理能力,提升了多线程环境下的性能和可维护性。...

    JDK 1.5 for Windows

    **JDK 1.5 for Windows** Java Development Kit (JDK) 1.5,也称为 Java 5.0,是Sun Microsystems开发的一个重要的Java平台版本。它在2004年9月30日正式发布,引入了许多新的特性和改进,对Java编程语言和Java...

    JDK1.5 中文版文档.rar

    9. **并发API(Concurrent APIs)**: JDK1.5加强了对多线程编程的支持,引入了并发工具类如`java.util.concurrent`包,包括`ExecutorService`、`Semaphore`、`CountDownLatch`等,以及`java.util.concurrent.atomic`...

    java JDK1.5实例宝典

    《Java JDK1.5实例宝典》是一本深入解析JDK1.5版本中关键特性和类库的实践指南,涵盖了Java Mail、Servlet、JSP以及多线程等多个核心领域。这本书通过丰富的实例来帮助读者理解和掌握Java编程的精髓。 在JDK1.5中,...

    JDK1.5新特性

    10. **线程并发库**:JDK 1.5加强了对多线程编程的支持,提供了`java.util.concurrent`包,包含如`ExecutorService`、`Future`、`Semaphore`等工具类,使得并发编程更加高效和安全。 11. **二进制表示(二进制 ...

    JDK1.5-1.6-1.7之新特性总结-1

    JDK 1.5增加了大量并发编程的工具类,如`java.util.concurrent`包下的`ExecutorService`、`Future`、`Semaphore`等,它们提供了更高效和安全的多线程处理方式。 **10. 遍历Map的键值对(For-Each Loop over Maps)*...

    jdk1.5 线程并发与线程池的使用

    JDK 1.5引入了`java.util.concurrent`包,提供了许多高级并发工具,如`ExecutorService`、`Future`、`Callable`、`CyclicBarrier`、`Semaphore`等,大大简化了并发编程。 **线程池的概念** 线程池(ThreadPool)是...

    中文版JDK 1.5 API文档

    10. **并发工具类(Concurrent Utility Classes)**: 新增了`java.util.concurrent`包,包含一系列线程安全的集合和并发工具,如`Executor`框架、`Future`、`Semaphore`等,提升了多线程编程的效率和安全性。...

    java jdk 实例宝典 源代码

    Java JDK实例宝典源代码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现机制。这份源代码提供了丰富的示例,帮助开发者深入理解Java语言的使用和内部工作原理。通过研究这些实例,我们可以...

    java jdk 实例宝典源码

    Java JDK实例宝典源码是Java开发者的重要参考资料,它涵盖了JDK中的各种核心类库、API及其实现的源代码。这些源码对于深入理解Java语言的底层运作机制、优化代码以及解决实际问题有着不可估量的价值。下面,我们将...

    Java Threads Third Edition

    这本书详细对比了JDK 1.4和JDK 1.5之间的差异,帮助开发者理解不同版本下线程处理的进化与改进。 在Java编程中,线程是并发执行的程序片段,它使得一个应用程序可以在同一时间执行多个任务。Java提供了丰富的API来...

    Java JDK 实例宝典 源代码

    10. **并发库**:Java提供了丰富的并发工具类,如ExecutorService、Semaphore、CountDownLatch等,实例会展示如何高效地管理线程池和控制并发。 11. **Java IO/NIO**:NIO(New Input/Output)是Java的非阻塞I/O...

    JDK实例宝典源码

    《Java JDK 实例宝典》是一本专注于JDK深度学习与实践的书籍,源码则提供了书中所有示例程序的实现,这对于Java开发者来说是一份宝贵的资源。在深入理解JDK的各种特性和功能时,通过实际操作这些源码,可以更直观地...

    java JDK 实例开发宝典 源代码

    Java JDK实例开发宝典源代码是一份非常宝贵的资源,它涵盖了Java开发中的各种核心概念和技术。JDK(Java Development Kit)是Java编程的基础,包含了Java运行环境、编译器、调试器以及各种工具,是每个Java开发者...

    JDK实例开发宝典 例子 源代码 ,很经典的

    《JDK实例开发宝典》是一本以Java JDK为中心,深度剖析其功能并提供大量实践示例的资源集合。这份压缩包中包含了丰富的源代码,旨在帮助开发者深入理解和运用Java JDK的各种工具和类库,从而提升开发效率和代码质量...

    JDK1.6中文开发API

    2. **枚举(Enums)**:JDK1.5引入,1.6继续完善,枚举类型为常量集合提供了一种强大的、类型安全的表示方式。枚举类型不能被实例化,有助于防止错误和提高代码质量。 3. **并发(Concurrency)**:1.6版本对并发库...

    jdk1.8中文文档.rar

    3. 方法引用来代替匿名内部类:在需要传递一个匿名内部类实例时,JDK 1.8允许直接使用方法引用来代替,简化了代码结构。 4. 新的日期和时间API:在java.time包下,JDK 1.8提供了新的日期和时间API,替代了旧有的...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    jdk api 1.8_中文文档

    java.util.concurrent包包含了一系列并发工具,如Semaphore(信号量)、CyclicBarrier(循环栅栏)和ExecutorService(执行器服务),帮助开发者更高效、安全地进行多线程编程。 以上只是《JDK API 1.8_中文文档》...

    Multi person chat_jdk1.8_java编程_

    3. **使用ExecutorService和Callable接口**:JDK 1.5引入的Executor框架允许更高级别的线程管理。Callable接口与Runnable类似,但可以返回结果。使用ExecutorService可以创建线程池,有效管理线程生命周期,提高性能...

Global site tag (gtag.js) - Google Analytics