A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨习平 中级黑马   /  2012-9-10 02:27  /  1413 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class ThreadTest1 {
                  private int j;
                  public static void main(String args[]){
                ThreadTest1 tt=new ThreadTest1();
                Inc inc=tt.new Inc();
                Dec dec=tt.new Dec();
                for(int i=0;i<2;i++){
                Thread t=new Thread(inc);
                t.start();
                t=new Thread(dec);
                t.start();
                }
                }
                  private synchronized void inc(){
                j++;
                System.out.println(Thread.currentThread().getName()+"-inc:"+j);
                  }
                  private synchronized void dec(){
                j--;
                System.out.println(Thread.currentThread().getName()+"-dec:"+j);
                  }
                  class Inc implements Runnable{
                public void run(){
                for(int i=0;i<100;i++){
                inc();
                }
                }
                  }
                  class Dec implements Runnable{
                public void run(){
                for(int i=0;i<100;i++){
                dec();
                }
                 }
                }
        }
帮帮找找错误的原因,求助,高手。。??执行结果为什么是不符合现实。

7 个回复

倒序浏览
额,不太懂你说的“不符合现实”是啥意思?在我看来,你启动了四个线程,对这个具有同步锁的资源j操作了400次,增和减各200次,最终的结果还是0.大哥,你要滴现实是啥子嘛?
回复 使用道具 举报
代码写的太乱不好阅读
回复 使用道具 举报
对不起,我没说清楚,我是说线程启动后执行的结果是错误的,还有负数的票。是不是不符合实际啊,你们怎么想的,我想在知道了点原因,但还是请求你们高手详解。
回复 使用道具 举报
你这就是启动四个线程,两个对j进行加,两个对j进行减,如果减的线程执行的多,当然是出现负值啊.

不知道你想实现什么功能?模拟售票?inc表示产生票?dec表示售出票?如果这样的话你的dec要判断下啊,如果j > 0才能售票才能减,否则没有票怎么卖啊
回复 使用道具 举报
本帖最后由 黑马_许芸 于 2012-9-10 14:31 编辑

//因为线程启动之后就木有啥先后顺序了,谁抢到资源就执行谁呗。所以你的程序出现负值很正常么,说明截止到那个时间点 j-- 的次数比 j++ 的次数多点而已嘛。如果你不想让执行结果中出现负值,可以使用 wati() 和 notify() 来进行控制,只需要分别在你的inc() 和 dec() 中加句话就行了。如下所示:

private synchronized void inc()
{
  j++;
  System.out.println(Thread.currentThread().getName() + "-inc:" + j);
  if (j>=1)
  {
   notify();  //如果 j>=1 了,就可以通知其他在等待的线程了,唤醒一个线程,但并不是马上就开始执行那个线程,还有等到当前线程释放资源。
  }
}
private synchronized void dec()
{
  if (j <= 0)
  {
   try
   {
    wait();  //如果 j<=0 了,就不能再减了,免得出现负值嘛。释放资源等待吧。
   } catch (InterruptedException e)
   {
    e.printStackTrace();
   }
  }
  j--;
  System.out.println(Thread.currentThread().getName() + "-dec:" + j);
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
lz你的程序很正常,.
回复 使用道具 举报
还是地板给力啊。谢谢,就是这样的效果,问题总算解决。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马