//我想用java模拟两个线程对一个堆栈的操作
package mypackage;
public class MyStack {
private int idx=0;
private char[] data=new char[6];
public synchronized void push(char c){
data[idx]=c;
idx++;
}
public synchronized char pop(){
idx--;
return data[idx];
}
public synchronized int getIdx(){
return idx;
}
public synchronized int getIdx(){//获取栈顶指针,一会儿问题就在这里
return idx;
}
}package mypackage;
//dopush线程模拟的是压栈操作
public class dopush extends Thread{
char c;
private MyStack my;
public dopush(MyStack my){
this.my=my;
}
@Override
public void run() {
for(int i=0;i<100;i++){
if(my.getIdx()<5){
c=(char)(Math.random()*26+'A');
my.push(c);
System.out.println("Push:"+c+my.getIdx());//先执行的压栈操作,这个时候
}
}
}
}package mypackage;
//dopup线程模拟的是弹栈操作
public class dopop extends Thread{
char c;
private MyStack my;
public dopop(MyStack my) {
this.my=my;
}
@Override
public void run() {
System.out.println(my.getIdx());//在这个方法中调用getIdx方法获得栈顶指针的时候为什么是0?
for(int i=0;i<100;i++){
if(my.getIdx()>0){
c=my.pop();
System.out.println("pop:"+c);
}
}
}
}package mypackage;
//进行测试,发现压栈操作可以执行,但是弹栈操作的时候出现了问题,调用getIdx方法获得栈顶指针的时候总是为0,请问这是为什么?
public class tas {
public static void main(String[]args){
MyStack c=new MyStack();
dopush pus=new dopush(c);
System.out.println(c.getIdx());//并且在主程序中调用的getIdx方法的时候也是为0
dopop dop=new dopop(c);
pus.start();
dop.start();
}
}//运行多次后发现,十次中可能有九次都不会pop,运气好的时候有一次会调用pop方法
添加回答
举报
0/150
提交
取消