为了账号安全,请及时绑定邮箱和手机立即绑定

关于java 线程的一个问题

关于java 线程的一个问题

zhengzongm 2016-07-22 11:42:57
//我想用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方法
查看完整描述

1 回答

?
夏雪忆梦0

TA贡献2条经验 获得超1个赞

什么问题

查看完整回答
反对 回复 2016-07-28
  • 1 回答
  • 1 关注
  • 1305 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信