为兼容jdk1.5之前版本的信号量操作:
1.Semahpore
2
package com.jzy.thread;
import java.util.Random;
import java.util.Vector;
//信号量
public class Semahpore {
private Vector locks=new Vector(); //保存线程
private int permitNum=1; //允许的的信号量数
private int nowPermitNum=1; //现在的信号量数
private boolean isAllowGrow=false; //是否自动增长信号量数
private boolean fair=false; //是否公平
Random random=new Random();
public Semahpore(int permitNum,boolean isAllowGrow,boolean fair){
this.permitNum=permitNum;
nowPermitNum=permitNum;
this.isAllowGrow=isAllowGrow;
this.fair=fair;
}
public Semahpore(int permitNum,boolean fair){
this(permitNum, true, fair);
}
public Semahpore(int permitNum){
this(permitNum, false);
}
// 消费者希望从信号量中获取一个信号许可,如果目前仍然存在可用许可,
//则消费者顺利执行,否则消费者线程阻塞等待,直到生产者生产资源,产生新的许可
public void acquier(){
if(nowPermitNum>0){
nowPermitNum--;
}else{
Object obj=new Object();
locks.add(obj);
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 生产者已经生产了新的可供消费资源,向信号量中增加一个可用许可
public void relase(){
if(locks.size()>0){
int index=0;
if(!fair){
index=Math.abs(random.nextInt())%locks.size();
}
Object obj=locks.get(index);
locks.remove(index);
synchronized (obj) {
obj.notify();
}
}else if(isAllowGrow||nowPermitNum<permitNum){
nowPermitNum++;
}
}
}
2.TestCustomerAndPudction
package com.jzy.thread;
import java.util.Random;
import java.util.UUID;
import java.util.Vector;
public class TestCustomerAndPudction {
/**
* @param args
*/
public static void main(String[] args) {
final Vector buffer = new Vector(); //保存生产者产生的数据
final Random random = new Random();
final Semahpore sem = new Semahpore(0,true,true);
final int x = Math.abs(random.nextInt()) % 100; //定义消费者等待时间
final int y = Math.abs(random.nextInt()) % 1000; //定义生产者等待时间
Thread c1 = new Thread() {
public void run() {
while (true) {
System.out.println("消费者1请求获取资源");
sem.acquier();
String str = buffer.get(0).toString();
System.out.println("消费者1获取资源是" + str);
try {
Thread.sleep(100 + x);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread c2 = new Thread() {
public void run() {
while (true) {
System.out.println("消费者2请求获取资源");
sem.acquier();
String str = buffer.get(0).toString();
System.out.println("消费者2获取资源是" + str);
try {
Thread.sleep(100 + x);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread c3 = new Thread() {
public void run() {
while (true) {
System.out.println("消费者3请求获取资源");
sem.acquier();
String str = buffer.get(0).toString();
System.out.println("消费者3获取资源是" + str);
try {
Thread.sleep(100 + x);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
c1.start();
c2.start();
c3.start();
Thread p1 = new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(1000 + y);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str=UUID.randomUUID().toString();
buffer.add(str);
System.out.println("生产者1生产了资源:"+str);
sem.relase();
}
}
};
Thread p2 = new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(1000 + y);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str=UUID.randomUUID().toString();
buffer.add(str);
System.out.println("生产者2生产了资源:"+str);
sem.relase();
}
}
};
p1.start();
p2.start();
}
}
转载于:https://blog.51cto.com/jiangzhiyong/1251249