Java中怎么控制线程訪问资源的数量
在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中怎么控制线程訪问资源的数量的更多相关文章
- Java:谈谈控制线程的几种办法
目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...
- Java中如何创建线程
Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...
- [WF4.0 实战] AutoResetEvent具体解释(线程独占訪问资源)
由来: 在学习工作流的过程中,宿主程序中会出现这么一段代码: staticAutoResetEvent instanceUnloaded = new AutoResetEvent(false); 然后 ...
- ThreadLocal,Java中特殊的线程绑定机制
在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...
- Java-ThreadLocal,Java中特殊的线程绑定机制
在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...
- Java中多个线程交替循环执行
有些时候面试官经常会问,两个线程怎么交替执行呀,如果是三个线程,又怎么交替执行呀,这种问题一般人还真不一定能回答上来.多线程这块如果理解的不好,学起来是很吃力的,更别说面试了.下面我们就来剖析一下怎么 ...
- 关于Java中进程和线程的详解
一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...
- Java中怎样创建线程安全的方法
面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter { private static int counter = 0; public static int ...
随机推荐
- PHP - 抓取电视剧资源
<?php /** * 获取下载url * @return [type] [description] */ function getVedioDwonloadUrl() { for ($i=1; ...
- gcc支持c99验证
gcc3.0以上的版本都是支持C99标准的, 但是编译程序的时候需要加上 -std=c9 才可以: 一下程序是验证gcc是否支持c99标准的: #include <stdio.h> ...
- Hadoop Error:Name node is in safe mode的解决方法
Error:name node is in safe mode 解决方法:hadoop dfsadmin -safemode leave(见图)
- windows服务怎么向应用程序发消息(部署在同一台机,非SCOKET)
命名管道:NamedPipeClientStream & NamedPipeClientStream 参考实例:http://msdn.microsoft.com/zh-cn/library/ ...
- 使用Maven构建和部署J2EE应用程序的EAR文件
这篇文章.主要是技术上的整理,用来mark一下,用的时候參考. 一.新建项目 新建一个空的Maven Project项目 二.放入依赖 注:ear部署时假设里面有entity,会错误发生.所以不要把e ...
- C++ 中dynamic_cast<>的用法
/*这是从网上摘下的样例,主要讲述了 dynamic_cast<> 的用法.*/ /* 作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会依据基类指针是否真 ...
- Domain(AD) 管理
新建账户 文件夹权限管理
- Permutations【python】
class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(se ...
- 面试中的Singleton
引子 “请写一个Singleton.”面试官微笑着和我说. “这可真简单.”我心里想着,并在白板上写下了下面的Singleton实现: 1 class Singleton 2 { 3 public ...
- Jquery progressbar通过Ajax请求获取后台进度演示
项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...