信号量(Semaphore),实现方法的并发限量使用
2008-11-05 06:33
645 查看
原文地址:http://www.java2000.net/p11622
上次使用了自己设计的结构,实现了一个方法,只能被2个线程同时使用
package concurrent;
import java.util.concurrent.Semaphore;
/**
* 信号量,实现方法的多线程限量使用。
*
* @author 老紫竹 J***A世纪网(java2000.net)
*
*/
public class SemaphoreTest extends Thread {
public static void main(String[] args) {
for (int i = 0; i <= 10; i++) {
new SemaphoreTest().start();
}
}
public void run() {
int i = 2;
OnlyTwo ot = new OnlyTwo();
while (i-- > 0) {
System.out.printf("[%3d]%d=%d/n",this.getId(),System.currentTimeMillis(),+ot.getSomthing());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
ot.returnSomthing();
}
}
}
class OnlyTwo {
private static final int MAX_***AILABLE = 3;
private static final Semaphore available = new Semaphore(MAX_***AILABLE, false);
private static int NUM = 1;
/**
* 执行方法。
*
* @return
*/
public int getSomthing() {
try {
available.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
return NUM++;
}
/**
* 归还
*/
public void returnSomthing() {
available.release();
}
}
运行效果
[ 9]1225837305234=1
[ 10]1225837305250=3
[ 8]1225837305250=2
[ 8]1225837305468=4
[ 10]1225837305468=6
[ 9]1225837305468=5
[ 12]1225837305250=7
[ 14]1225837305250=8
[ 16]1225837305250=9
[ 16]1225837305875=10
[ 12]1225837305875=12
[ 14]1225837305875=11
[ 18]1225837305250=13
[ 13]1225837305250=15
[ 11]1225837305250=14
[ 18]1225837306281=16
[ 13]1225837306281=18
[ 11]1225837306281=17
[ 15]1225837305250=19
[ 17]1225837305250=20
[ 17]1225837306687=21
[ 15]1225837306687=22
上次使用了自己设计的结构,实现了一个方法,只能被2个线程同时使用
一个方法最多2个线程同时使用的J***A实现
经网友提醒,发现用信号量才是正途,我这里只给出测试代码和运行效果,其它的大家自己看吧package concurrent;
import java.util.concurrent.Semaphore;
/**
* 信号量,实现方法的多线程限量使用。
*
* @author 老紫竹 J***A世纪网(java2000.net)
*
*/
public class SemaphoreTest extends Thread {
public static void main(String[] args) {
for (int i = 0; i <= 10; i++) {
new SemaphoreTest().start();
}
}
public void run() {
int i = 2;
OnlyTwo ot = new OnlyTwo();
while (i-- > 0) {
System.out.printf("[%3d]%d=%d/n",this.getId(),System.currentTimeMillis(),+ot.getSomthing());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
ot.returnSomthing();
}
}
}
class OnlyTwo {
private static final int MAX_***AILABLE = 3;
private static final Semaphore available = new Semaphore(MAX_***AILABLE, false);
private static int NUM = 1;
/**
* 执行方法。
*
* @return
*/
public int getSomthing() {
try {
available.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
return NUM++;
}
/**
* 归还
*/
public void returnSomthing() {
available.release();
}
}
运行效果
[ 9]1225837305234=1
[ 10]1225837305250=3
[ 8]1225837305250=2
[ 8]1225837305468=4
[ 10]1225837305468=6
[ 9]1225837305468=5
[ 12]1225837305250=7
[ 14]1225837305250=8
[ 16]1225837305250=9
[ 16]1225837305875=10
[ 12]1225837305875=12
[ 14]1225837305875=11
[ 18]1225837305250=13
[ 13]1225837305250=15
[ 11]1225837305250=14
[ 18]1225837306281=16
[ 13]1225837306281=18
[ 11]1225837306281=17
[ 15]1225837305250=19
[ 17]1225837305250=20
[ 17]1225837306687=21
[ 15]1225837306687=22
相关文章推荐
- 剖析基于并发AQS的共享锁的实现(基于信号量Semaphore)
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(7)
- 使用Semaphore控制某个方法允许并发访问的线程的个数
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(1)
- python多线程threading使用Semaphore或BoundedSemaphore实现并发限制
- Java并发编程核心方法与框架-Semaphore的使用
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(4)
- Java并发编程核心方法与框架-Semaphore的使用
- 并发编程--使用synchronized实现同步方法
- PHP使用Redis实现防止大并发下二次写入的方法
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(5)
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(2)
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(6)
- Linux 设备驱动--- 并发 之- 信号量 --- semaphore --- down_interruptible --- 按键信号量使用
- 进阶篇:使用信号量Semaphore实现数据库连接池(十七)
- C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法
- Java并发编程中级篇(一):使用Semaphore信号量进行并发控制
- PHP使用curl_multi实现并发请求的方法示例
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(3)
- 161207、高并发:java.util.concurrent.Semaphore实现字符串池及其常用方法介绍