Semaphore初探
示例一:
package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; /**
* Semaphore 用于为线程加锁与释放锁
* @author hapday
* @2017年1月16日 @下午8:50:55
*/
public class SemaphoreTest { public static void main(String[] args) {
int permissionCount = 5; // 许可数
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(permissionCount); // 声明并实例化“许可数”为 5 的 Semaphore 实例 for(int index = 0; index < 10; index++) {
try {
// 休眠 0.1 秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} Runnable runnable = new Runnable() { @Override
public void run() {
try {
// 当前线程请求获取 semaphore 的“许可”;如果获得了 semaphore 的“许可”则此线程继续则行,并且 semaphore 的许可数减一;否则此线程进入阻塞状态。
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("线程:" + Thread.currentThread().getName() + " 进入,当前已有 " + (permissionCount - semaphore.availablePermits()) + " 个并发线程。"); try {
Thread.sleep((long) (Math.random() * 10000));
// Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("线程:" + Thread.currentThread().getName() + " 即将离开...");
semaphore.release(); // 将当前的线程释放“许可数”,semaphore 的许可数加一,至于哪个线程先离开没有固定的顺序
System.out.println("线程:" + Thread.currentThread().getName() + " 已离开,当前已有 " + (permissionCount - semaphore.availablePermits()) + " 个并发线程已离开。");
} }; executorService.execute(runnable);
}
} }
示例二:
package com.smbea.demo.semaphore; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* Semaphore 用于为线程加锁与释放锁
* @author hapday
* @2017年1月16日 @下午8:50:55
*/
public class SemaphoreTest2 { public static void main(String[] args) {
int permissionCount = 5; // 许可数
ExecutorService executorService = Executors.newFixedThreadPool(permissionCount);
Counter counter = new Counter(); for(int index = 0; index < 8; index++) {
try {
// 休眠 0.1 秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} executorService.execute(new Runnable() { @Override
public void run() {
counter.calculate();
} }); } executorService.shutdown(); } public static class Counter {
private int count = 0;
Lock lock = new ReentrantLock();
int permissionCount = 5; // 许可数
Semaphore semaphore = new Semaphore(permissionCount); public void calculate() {
// lock.lock();
try {
// 当前的线程请求获取“锁”
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
} try {
count++; try {
// 休眠 1 秒钟
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("线程:" + Thread.currentThread().getName() + ",count = " + count);
} finally {
semaphore.release(); // 释放当前线程的“锁”
// lock.unlock();
} }
} }
Semaphore初探的更多相关文章
- Java中Semaphore(信号量)的使用
Semaphore的作用: 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了 ...
- java并发编程(四)----(JUC)Lock锁初探
首先我们来回忆一下上一节讲过的synchronized关键字,该关键字用于给代码段或方法加锁,使得某一时刻它修饰的方法或代码段只能被一个线程访问.那么试想,当我们遇到这样的情况:当synchroniz ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 多线程条件通行工具——Semaphore
Semaphore的作用是,限制线程通行的数量,如果线程进入时达到通行数量,便等待其它正在通行的线程释放. acquire()获取通行 release()释放通行 availablePermits() ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
随机推荐
- web.xml运行序列总结
在整个订单<context-param>--<listener>--<filter>--<servlet>. 其中,内的各类别中的序列被运行.和< ...
- automake/autoconf的简单例子
参考文章1:http://loftor.com/archives/automake.html 参考文章2:http://www.blogjava.net/huyi2006/articles/18790 ...
- EF6.0执行sql存储过程案例
数据填充实体:ZF_Btns; 存储过程名称:test; --方式一: db.Database.SqlQuery<ZF_Btns>("test @Id,@UName output ...
- NodeJs技术
我的NodeJs技术总结——第一篇 既然是我的技术总结,那就是以我的技术水平为基础的,写浅了大家不要笑话,如果有错误的地方还望指正. 这第一篇就谈谈NodeJs的一些编程细节吧. 1.遍历数组 f ...
- [转载+实践理解]Android动画---如何正确使用平移动画(关于fillBefore和fillAfter的一点说明)(转载)
红色部分为自己的实践理解 如何实现将View向上平移自身高度一半的距离? TranslateAnimation translate = new TranslateAnimation( Animatio ...
- 利用cxfreeze将Python 3.3打包成exe程序
参考自别人的博文:http://blog.csdn.net/yatere/article/details/6667230 步骤如下: (1) 下载cxfreeze后安装(先得安装python 3.3) ...
- robotlegs2.0框架实例源码带注释
robotlegs2.0框架实例源码带注释 Robotlegs2的Starling扩展 有个老外写了robotleges2的starling扩展,地址是 https://github.com/brea ...
- 解决C# WinForm 中 VSHOST.EXE 程序不关闭的问题
右击“解决方案”--属性-调试栏-启用调试器部分-“启用Visual studio宿主进程”不勾选
- Roslyn and NRefactory
1.Roslyn: 微软今天(2012-06-06)向CTP社区发布了Roslyn编译器的最新版本,它主要用于Visual Basic和C#代码,可工作于Visual Studio 2010 SP1和 ...
- IP地址爬取
ip_spider.py= = = #!/usr/bin/python # coding: utf-8 import os import sys import requests import re i ...