在API中是这样来描写叙述Semaphore 的

Semaphore 通经常使用于限制能够訪问某些资源(物理或逻辑的)的线程数目。

一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会堵塞每个 acquire(),然后再获取该许可。每个
release() 加入一个许可,从而可能释放一个正在堵塞的获取者。可是,不使用实际的许可对象,Semaphore 仅仅对可用许可的号码进行计数,并採取对应的行动。

比如,以下的类使用信号量控制线程并发的数量

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; public class TestSemaphore { /**
* @param args
*/
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
final Semaphore sp = new Semaphore(3,true);
for(int i=0;i<10;i++){
Runnable runnable = new Runnable() { @Override
public void run() { try {
sp.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sp.availablePermits());
System.out.println("线程 "+ Thread.currentThread().getName() +"进入,已有"+ (3-sp.availablePermits())+ "并发") ;
try {
Thread.sleep((long) (Math.random()*3000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 "+Thread.currentThread().getName() +"即将离开 " );
sp.release();
System.out.println("线程 "+Thread.currentThread().getName() +"离开 ,已有"+ (3-sp.availablePermits()) + "并发");
}
};
pool.execute(runnable);
}
} }

再比如能够通过信号量来控制线程訪问资源:

import java.util.concurrent.Semaphore;

public class DownloadThread {
private static int in_index = 0;
private static int out_index = 0;
private static int buffer_count = 100;
public static boolean g_downloadComplete;
private static Semaphore g_seFull = new Semaphore(0);
private static Semaphore g_seEmpty = new Semaphore(buffer_count);
public static boolean getBlockFromNet(int in_index) {
int i = 0;
while (i < 10000)
i++;
if (in_index < buffer_count - 1)
return false;
else
return true;
}
public static void writeBlockToDisk(int out_index) {
int i = 0;
while (i < 100000)
i++;
} /**
* @param args
*/
public static void main(String[] args) {
g_downloadComplete = false;
Thread threadA = new Thread() {
public void run() {
proA();
}
};
Thread threadB = new Thread() {
public void run() {
proB();
}
};
threadB.start();
threadA.start();
} public static void proA(){
while (g_seFull.availablePermits() < buffer_count) {
try {
g_seEmpty.acquire();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
g_downloadComplete = getBlockFromNet(in_index);
in_index = (in_index + 1) % buffer_count;
g_seFull.release();
System.out.println("download a block " + in_index);
if (g_downloadComplete)
break;
}
} public static void proB(){
while (g_seEmpty.availablePermits() > 0) {
try {
g_seFull.acquire();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
writeBlockToDisk(out_index);
out_index = (out_index + 1) % buffer_count;
g_seEmpty.release();
System.out.println("write a block " + out_index);
if (g_downloadComplete && out_index == in_index)
break;
}
} }

Java中怎么控制线程訪问资源的数量的更多相关文章

  1. Java:谈谈控制线程的几种办法

    目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...

  2. Java中的守护线程 & 非守护线程(简介)

    Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...

  3. Java中如何创建线程

    Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...

  4. [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)

    由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...

  5. ThreadLocal,Java中特殊的线程绑定机制

    在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...

  6. Java-ThreadLocal,Java中特殊的线程绑定机制

    在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...

  7. Java中多个线程交替循环执行

    有些时候面试官经常会问,两个线程怎么交替执行呀,如果是三个线程,又怎么交替执行呀,这种问题一般人还真不一定能回答上来.多线程这块如果理解的不好,学起来是很吃力的,更别说面试了.下面我们就来剖析一下怎么 ...

  8. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  9. Java中怎样创建线程安全的方法

    面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter { private static int counter = 0; public static int ...

随机推荐

  1. svn笔记

    安装部署 1.yum install subversion   2.创建svn版本库目录 mkdir -p /svn   3.创建版本库 svnadmin create /svn/fengchao/ ...

  2. Linux远程桌面工具 -- NoMachine

    玩Linux系统,会经常用到远程桌面软件. 我一直用的2个是Xmanager 和 VNC. 今天看到一个新软件: NoMachine. NoMachine NX 是一个快速的终端服务器和虚拟桌面软件, ...

  3. 常用位操作,读8位 I2C 1302 18B20 .

    /*1302*/ unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) { unsigned char i; for(i=8; i>0; ...

  4. JFinal教程1——小白的第一个JFinal程序

    为了使小白能够完全的按步骤创建第一个JFinal应用并运行,笔者将以Java界最流行的Eclipse平台为例,搭建出所有基础教程中喜欢的Hello world应用. 1. JFinal简介 2. 小白 ...

  5. Android--开发过程中使用到的长度单位

    px:表示屏幕实际的像素. in:表示英寸. mm:毫米. pt:表示一个点,是屏幕的物理尺寸. dp:(与密度无关的像素)逻辑长度单位,在160dpi屏幕上,1dp = 1px = 1/160英寸 ...

  6. VMware 11安装Mac OS X 10.10 及安装Mac Vmware Tools(超详细),以及动态调整虚拟机硬盘大小

    先上一张效果图兴奋一下,博主穷屌丝一个,只能通过虚拟黑苹果体验下高富帅的生活,感觉超爽的,废话不多说的,直接上图了! 目录: 1.安装所需软件下载: 2.Mac OS X10.10 安装基本步骤: 3 ...

  7. Visual Studio 2012的新技术特性

    前言 我更换了VS2012开发工具,那么它有什么特性呢? [caption id="attachment_1235" align="alignnone" wid ...

  8. Connection reset by peer问题分析

    extremetable导出excel,弹出一个下载窗口,这时不点下载而点取消,则报下面的异常: ClientAbortException Caused by: java.net.SocketExce ...

  9. 基于visual Studio2013解决算法导论之004随机排列数组

     题目 随机排列数组 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> # ...

  10. MinGW介绍与使用

    3.1:MinGW 是什么? MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境.MinGW 收集了一系列免费的Windows 使用的头文件和库文件:同时整合了GNU ( ht ...