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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-3-21 12:32  /  1800 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-3-21 12:44 编辑
  1. public class ThreadTest01 implements Runnable {

  2.         public void run() {
  3.                 int tickets=100;
  4.                 while(true) {
  5.                         if(tickets!=0)
  6.                         {
  7.                                 try{Thread.sleep(10);}catch(Exception e) {}
  8.                                 System.out.println(Thread.currentThread().getName()+":  "+tickets--);
  9.                         }
  10.                 }               
  11.         }

  12.         public static void main(String[] args) {
  13.                 ThreadTest01 tt = new ThreadTest01();
  14.                 new Thread(tt).start();
  15.                 new Thread(tt).start();
  16.                 new Thread(tt).start();
  17.                 new Thread(tt).start();

  18.         }

  19. }
复制代码
我看张孝详的视频里是会打出按顺序的数字,从100~0,-1,-2,而我的好像代码跟张老师都一样的,但是
  • 打出来的却是每个数字打4次
  • 而且次每次的线程执行顺序还相同
  • 只打印到1,没有打印0,-1,-2

如图:

这是为什么呢?不知道是我代码哪里不对,还是说机子不同结果不同,但是也不应该相差这么大吧。

4 个回复

倒序浏览
public class Tongbu{
    private int j;
    public static void main(String args[]){
            Tongbu tt=new Tongbu();
            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();
                    }
                }
        }
}
回复 使用道具 举报
刚刚找出了问题所在,是我把tickets变量定义成了局部变量,应该定义为成员变量的。但是我传给Thread构造方法的参数都是同一个对象啊,虽然定义的是局部变量,但是传到不同的线程里,局部变量就不是同一个变量了吗?
回复 使用道具 举报
开启了四个线程。每个都在运行。这样当然是4个。只开一个。就从100倒序打印到1。  至于没有0 -1 -2.就不懂了。
回复 使用道具 举报
戴振良 发表于 2012-3-21 13:32
刚刚找出了问题所在,是我把tickets变量定义成了局部变量,应该定义为成员变量的。但是我传给Thread构造方 ...

怎么可能是局部变量,线程a拿到局部变量的时候,还没有进行操作就睡眠了,其他线程再拿到的也是没有修改后的,这样睡眠起来后就同时减或者加了,所以出现的就是四个一样的结果。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马