关于java 线程的一个问题

//我想用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方法
zhengzongm
浏览 1334回答 1
1回答

夏雪忆梦0

什么问题
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java