/**
* @author licheng
* @Date 009-09-06
* @function 用于实现资源的栈
*
* */
package com.licheng.word.stack;
import java.util.ArrayList;
public class ObjectStack {
private int stackSize; // 栈大小
private Object[] stackArrayObjects; // 存放资源
private int top; // 栈指针
public ObjectStack() {
super();
}
/**
* 初始化栈
*/
public ObjectStack(int stackSize) {
this.stackSize = stackSize;
this.stackArrayObjects = new Object[stackSize];
this.top = -1;
}
/**
* @author licheng 判断是否是栈顶
*/
public boolean isTop() {
return (this.top == this.stackSize - 1);
}
/**
* @author licheng 判断是否是栈底
*/
public boolean isFundus() {
return (this.top == -1);
}
/**
* @author licheng 压栈
*/
public void push(Object object) {
if (!isTop()) {
stackArrayObjects[++this.top] = object;
}
}
/**
* @author licheng 出栈
*/
public Object getStack() {
if (!isFundus()) {
return stackArrayObjects[this.top--];
}
return null;
}
/**
* @author licheng 取资源,没有则进入等待队列
*
*/
public static void getResourceByStack(ObjectStack stack) {
synchronized (stack) { // 同步资源
Object object = stack.getStack();
if (null == object) {
try {
stack.wait(1000 * 10); // 等待10秒
} catch (Exception e) {
e.printStackTrace();
}
object = stack.getStack();
if (null == object) {
System.out.println("Thread name:"
+ Thread.currentThread().getName()
+ "等待超时或被唤醒后仍未争得用户资源");
}
}
System.out.println("连接并获取资源");
}
}
/**
* @author licheng 归还资源
*/
public static void pushToStack(ObjectStack stack) {
synchronized (stack) {
stack.push(1);
System.out.println("本次连接结束,资源已归还到栈中");
System.out.println("Thread name:"
+ Thread.currentThread().getName() + ",notify...");
stack.notify(); // 唤醒线程
}
}
public static void main(String[] args) {
ObjectStack os = new ObjectStack(10);
os.push(new ArrayList());
os.push(new ArrayList());
while (!os.isFundus()) {
os.getStack();
System.out.println("pop");
}
try {
ObjectStack.getResourceByStack(os);
} catch (Exception e) {
e.printStackTrace();
}
}
}