Java5多线程---信号量(Semaphore)的使用
一、简介
Semaphore 也是一个java并发包中的一个非常有用的类,一个计数信号量。从概念上讲,信号量维护了一个许可的集。如果有必要,在许可可用前会阻塞每个 acquire(),然后再获取许可。每个relase()添加一个许可,从而可能释放一个正在阻塞的获取这。但是不使用实际的许可对象,Semaphore只对可用的许可的号码进行计数,并采取相应的行动。一般Semaphore 通常用于限制并发访问的某些资源的线程数目。下面有关Smaphore类相关的几个方法说明:
1、void acquire()
从信号量获取一个许可,在提供一个许前当前线程会阻塞,如果成功获取了许可并立即返回,将信号量中的有用许可减一
2、acquireUninterruptibly()
与acquire()方法相同,但是当前线程在等待许可被中断,那么他会继续等待
3、tryAcquire()
仅仅调用此信号量存在一个可用的许可,如果存在返回true ,不存在则返回false 并立即返回 。
4、tryAcquire(0,TimeUnit.SECONDS)
在单位等待时间内获取许可,这样希望是遵守公平的设置,如果已经超出等待时间会立即返回。
5、release()
释放一个许可,将其归还给指定的信号量
6、其它具体参考 官方API文档
二、应用案例
在现实的生活中,我们每天去餐厅吃饭,比如去kfc 。在kfc里面只有5个座位 一共来了21人要卖鸡腿吃饭,谁先买完东西谁先坐下吃饭,那么就像信号量中好比 kfc 5个座位好比5个许可 吃饭过程-- 找座位-吃饭-离开
就像信号量的一样,获取许可-执行任务-归还许可具体实现代码如下:
package java5; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * 信号量 Seamphone 的使用 * @author dongtian * @date 2015年6月16日 下午1:34:19 */ public class ShopPool { public static void main(String[] args) { final Semaphore semaphore = new Semaphore(5); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 21; i++) { final String name = "冬天"+ i; executorService.execute(new Runnable() { @Override public void run() { try { System.err.println(name +"进KFC买完东西正在找座位 ....."); semaphore.acquire(); System.err.println(name +"找到座位....吃饭."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }finally { System.err.println(name +"吃完饭了 让座位 离开KFC."); semaphore.release(); } } }); } executorService.shutdown(); } }
运行结果如下:
冬天0进KFC买完东西正在找座位 ..... 冬天0找到座位....吃饭. 冬天1进KFC买完东西正在找座位 ..... 冬天1找到座位....吃饭. 冬天3进KFC买完东西正在找座位 ..... 冬天3找到座位....吃饭. 冬天4进KFC买完东西正在找座位 ..... 冬天4找到座位....吃饭. 冬天2进KFC买完东西正在找座位 ..... 冬天2找到座位....吃饭. 冬天1吃完饭了 让座位 离开KFC. 冬天4吃完饭了 让座位 离开KFC. 冬天0吃完饭了 让座位 离开KFC. 冬天6进KFC买完东西正在找座位 ..... 冬天3吃完饭了 让座位 离开KFC. 冬天5进KFC买完东西正在找座位 ..... 冬天5找到座位....吃饭. 冬天8进KFC买完东西正在找座位 ..... 冬天8找到座位....吃饭. 冬天6找到座位....吃饭. 冬天7进KFC买完东西正在找座位 ..... 冬天7找到座位....吃饭. 冬天2吃完饭了 让座位 离开KFC. 冬天9进KFC买完东西正在找座位 ..... 冬天9找到座位....吃饭. 冬天8吃完饭了 让座位 离开KFC. 冬天5吃完饭了 让座位 离开KFC. 冬天10进KFC买完东西正在找座位 ..... 冬天10找到座位....吃饭. 冬天11进KFC买完东西正在找座位 ..... 冬天11找到座位....吃饭. 冬天6吃完饭了 让座位 离开KFC. 冬天12进KFC买完东西正在找座位 ..... 冬天12找到座位....吃饭. 冬天7吃完饭了 让座位 离开KFC. 冬天9吃完饭了 让座位 离开KFC. 冬天14进KFC买完东西正在找座位 ..... 冬天14找到座位....吃饭. 冬天13进KFC买完东西正在找座位 ..... 冬天13找到座位....吃饭. 冬天11吃完饭了 让座位 离开KFC. 冬天15进KFC买完东西正在找座位 ..... 冬天10吃完饭了 让座位 离开KFC. 冬天15找到座位....吃饭. 冬天16进KFC买完东西正在找座位 ..... 冬天16找到座位....吃饭. 冬天12吃完饭了 让座位 离开KFC. 冬天14吃完饭了 让座位 离开KFC. 冬天18进KFC买完东西正在找座位 ..... 冬天18找到座位....吃饭. 冬天13吃完饭了 让座位 离开KFC. 冬天19进KFC买完东西正在找座位 ..... 冬天19找到座位....吃饭. 冬天17进KFC买完东西正在找座位 ..... 冬天17找到座位....吃饭. 冬天16吃完饭了 让座位 离开KFC. 冬天20进KFC买完东西正在找座位 ..... 冬天20找到座位....吃饭. 冬天15吃完饭了 让座位 离开KFC. 冬天19吃完饭了 让座位 离开KFC. 冬天18吃完饭了 让座位 离开KFC. 冬天17吃完饭了 让座位 离开KFC.
Semaphore的使用,让我们可以很好的控制访问资源的并发数量的控制,具体更多详情请参考官方的API文档。
相关推荐
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...
信号量(Semaphore)是操作系统中一种重要的同步机制,它用于管理多个线程对共享资源的访问,以防止并发执行时产生竞态条件。在多线程编程中,当多...理解并正确使用信号量,对于编写高效、稳定的多线程程序至关重要。
- JUC包含了许多高级并发组件,如`Semaphore`信号量、`CyclicBarrier`回环栅栏、`CountDownLatch`倒计时器和`Exchanger`交换器等,它们可以帮助控制线程的执行顺序。 - `Semaphore`可以限制同时访问特定资源的线程...
在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定资源的线程数量。 ### Semaphore简介 信号量...
在"semaphore控制多线程循序执行"的场景中,我们通常会用到计数信号量,它的核心作用是限制同时访问特定资源的线程数量。例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印...
除此之外,Java的并发包`java.util.concurrent`提供了更高级的线程同步工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)允许一组线程等待彼此到达某个点后再继续执行,...
Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...
Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...
3. **并发工具类**:如`CountDownLatch`、`CyclicBarrier`和`Semaphore`等,它们为多线程间的协调提供了便利,比如计数器、栅栏和信号量,可以用于控制线程的同步和通信。 4. **锁机制**:包括`synchronized`关键字...
`Semaphore`信号量控制对有限资源的访问,`CountDownLatch`计数器用于等待一组线程完成操作,`CyclicBarrier`循环栅栏允许一组线程等待彼此到达某个点后再继续执行,而`Phaser`是Java 7引入的更高级的同步工具。...
Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...
- **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **ThreadPoolExecutor**:线程池,管理线程并处理任务队列,能有效控制运行的线程数量。 5. **文件传输** - **I/O流**:Java的`InputStream`和`...
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
- Semaphore:信号量,控制同时访问特定资源的线程数量。 - Phaser:更强大的同步工具,支持分阶段的同步。 7. **死锁、活锁与饥饿** - 死锁:两个或多个线程相互等待对方释放资源,导致都无法继续执行。 - ...
最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...
Java提供了多种同步机制来解决多线程环境下的数据安全问题,如synchronized关键字、 volatile变量、Lock接口(如ReentrantLock)以及Semaphore信号量等。synchronized提供了内置锁,可以保证同一时刻只有一个线程...
3. **Semaphore(信号量)**:`java.util.concurrent.Semaphore`类提供了一种控制同时访问特定资源的线程数量的方法。在顺序打印问题中,可以设置信号量的许可数量为1,每个线程在打印前获取许可,打印完成后释放...
- `Semaphore`:信号量,限制同时访问特定资源的线程数量。 理解并熟练掌握这些知识点,对于解决Java并发问题和优化多线程应用至关重要。在实际工作中,还需要关注线程安全、性能优化和代码可维护性等问题。
Java提供了多种并发控制机制,如synchronized关键字、Lock接口(如ReentrantLock)以及Semaphore(信号量)等,用于控制线程的访问权限和执行顺序。 3. **网络I/O**:Java的`java.net`包提供了处理网络通信的基础...
- **信号量(Semaphore)**:当某一线程下载完其负责的部分后,可能需要通知其他线程开始下载下一阶段,这时可以使用信号量来控制线程间的同步。 4. **线程池的配置** - **核心线程数(corePoolSize)**:线程池...