`

concurrent包,多线程信号量Semaphore

阅读更多

     信号量大家都不陌生引用百度百科上的解释

     信号量在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

     下面学习一下concurrent包下的 Semaphore 类


      举个恶心的例子:蹲茅坑,现在有5个坑,有20个人在排队等着5个坑,那么只有等其中一个人上完了厕所以后,另外一个才能进去。

      Semaphore 正是实现了这种功能。

 

import java.util.concurrent.*;

/**
 * 
 * @author myemptyname
 *
 */

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(NO+"号上厕所: ");
						Thread.sleep((long) (Math.random() * 10000));
						// 上完了 舒服
						semp.release();
						System.out.println(NO+"出厕所");
						System.out.println("现在有"+ semp.availablePermits()+"个茅坑");

					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
	}

}

 

 

分享到:
评论

相关推荐

    Concurrent.Thread.js多线程执行大批量函数

    介绍了一个可以在JavaScript中应用多线程的库:Concurrent.Thread,内有多线程库脚本,以及使用说明和实例,如果查看详情,可以查看我的博客https://blog.csdn.net/hsl_1990_08_15/article/details/84765772

    concurrent 多线程 教材

    00 IBM developerWorks 中国 : Java 多线程与并发编程专题 02 Java 程序中的多线程 03 编写多线程的 Java 应用程序 04 如果我是国王:关于解决 Java编程语言线程问题的建议 (2) 05 构建Java并发模型框架 (2) 06...

    java.util.concurrent-多线程框架.docx

    java.util.concurrent-多线程框架

    java同步大杀器concurrent 包

    java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大...

    java concurrent 包 详细解析

    java concurrent 包 详细解析

    多线程concurrent的用例

    多线程concurrent的详细使用,为转载,里面是java类,直接拷到Eclipse中就可以运行

    java.concurrent包的应用

    JAVA后台程序以及java.concurrent包的应用

    Concurrent.Thread.js javascript多线程

    Concurrent.Thread.js 一个用来让javascript也进行多线程开发的包,感兴趣的快来下吧。

    java并发工具包 java.util.concurrent中文版用户指南pdf

    15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    个人总结的深入java多线程开发

    6)信号量Semaphore 31 7)ReentrantLock可重入的互斥锁定 Lock 32 8)阻塞队列BlockingQueue 34 9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的...

    Concurrent.Thread JS版多线程库

    介绍了一个可以在JavaScript中应用多线程的库:Concurrent.Thread,内有多线程库脚本,以及使用说明和实例

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

    Concurrent包的小例子

    Concurrent下的例子,涵盖了大部分常用类 例如BlockingQueue、CountDownLatch、CyclicBarrier、Exchanger、ExecuteService、lock、timeutil等

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    c# 线程安全队列的用法原理及使用示例

    答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程...

    java concurrent包分类结构图

    java concurrent包分类结构图

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    java 多线程同步

    java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发...

    jdk1.6API中文+concurrent并发包API介绍.zip

    包含了java1.6 API的中文工具,能对API进行查找,查看中文描述,对API类里面的结构,构造器,方法,成员变量都能一目了然,并且打包concurrent并发包,助你在java多线程道路上一帆风顺。

Global site tag (gtag.js) - Google Analytics