黑马程序员技术交流社区

标题: 关于多线程的问题 [打印本页]

作者: 戴振良    时间: 2012-3-21 12:32
标题: 关于多线程的问题
本帖最后由 戴振良 于 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,而我的好像代码跟张老师都一样的,但是

如图:

这是为什么呢?不知道是我代码哪里不对,还是说机子不同结果不同,但是也不应该相差这么大吧。
作者: 黑马胡林    时间: 2012-3-21 12:47
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();
                    }
                }
        }
}
作者: 戴振良    时间: 2012-3-21 13:32
刚刚找出了问题所在,是我把tickets变量定义成了局部变量,应该定义为成员变量的。但是我传给Thread构造方法的参数都是同一个对象啊,虽然定义的是局部变量,但是传到不同的线程里,局部变量就不是同一个变量了吗?
作者: ♂诸侯♂    时间: 2012-3-21 13:36
开启了四个线程。每个都在运行。这样当然是4个。只开一个。就从100倒序打印到1。  至于没有0 -1 -2.就不懂了。
作者: 张锐    时间: 2012-3-21 13:43
戴振良 发表于 2012-3-21 13:32
刚刚找出了问题所在,是我把tickets变量定义成了局部变量,应该定义为成员变量的。但是我传给Thread构造方 ...

怎么可能是局部变量,线程a拿到局部变量的时候,还没有进行操作就睡眠了,其他线程再拿到的也是没有修改后的,这样睡眠起来后就同时减或者加了,所以出现的就是四个一样的结果。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2