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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邢晏玮 中级黑马   /  2012-11-4 11:05  /  2438 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邢晏玮 于 2012-11-9 15:53 编辑
  1. class Tick implements Runnable
  2. {
  3.         private int tk = 100;
  4.         public void run()
  5.         {
  6.                 while(true)
  7.                 {
  8.                         if(tk>0)
  9.                         {
  10.                                 System.out.println(Thread.currentThread().getName()+"....sale : "+ tk--);
  11.                         }
  12.                 }
  13. //                for(int tk = 100;tk>0;tk--)
  14. //                {
  15. //                        System.out.println(Thread.currentThread().getName()+"..."+tk);
  16. //                }
  17.         }
  18. }
  19. public class ThreadDemo01
  20. {
  21.         public static void main(String args[])
  22.         {
  23.                 Tick t = new Tick();
  24.                 Thread t1 = new Thread(t);
  25.                 Thread t2 = new Thread(t);
  26.                 Thread t3 = new Thread(t);
  27.                 Thread t4 = new Thread(t);
  28.                 t1.start();
  29.                 t2.start();
  30.                 t3.start();
  31.                 t4.start();
  32.                
  33.         }
  34. }
复制代码
听了毕老师的课 写了个小程序 但是有个问题请各位帮帮忙
  1. while(true)
  2.                 {
  3.                         if(tk>0)
  4.                         {
  5.                                 System.out.println(Thread.currentThread().getName()+"....sale : "+ tk--);
  6.                         }
  7.                 }
复制代码
要是换成了for的循环就没有出现预期的效果,还是每个线程都执行了一遍 也就是说还是卖出了四百张的票  并没有像用while 循环输出卖出了一百张的票 是怎么回事呢?帮帮忙!

捕获.GIF (24.54 KB, 下载次数: 40)

捕获.GIF

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
本帖最后由 都彭韬 于 2012-11-4 11:27 编辑

因为
  1. for(int tk = 100;tk>0;tk--)
  2.                 {
  3.                        System.out.println(Thread.currentThread().getName()+"..."+tk);
  4.               }
复制代码
中的 tk 是局部变量

我这样改了一下,
  1. class Tick implements Runnable
  2. {
  3.         private int tk = 100;
  4.         public void run()
  5.         {
  6. //                while(true)
  7. //                {
  8. //                        if(tk>0)
  9. //                        {
  10. //                                System.out.println(Thread.currentThread().getName()+"....sale : "+ tk--);
  11. //                        }else{
  12. //                                break;
  13. //                        }
  14. //                }
  15.                 for( ;tk>0;)
  16.                 {
  17.                         System.out.println(Thread.currentThread().getName()+"..."+tk--);
  18.                 }
  19.         }
  20. }
  21. class ThreadDemo01
  22. {
  23.         
  24.         public static void main(String args[])
  25.         {
  26.                 Tick t = new Tick();
  27.                 Thread t1 = new Thread(t);
  28.                 Thread t2 = new Thread(t);
  29.                 Thread t3 = new Thread(t);
  30.                 Thread t4 = new Thread(t);
  31.                 t1.start();
  32.                 t2.start();
  33.                 t3.start();
  34.                 t4.start();
  35.                
  36.         }
  37. }
复制代码
你的while 别写出死循环哦~~

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 很给力!

查看全部评分

回复 使用道具 举报
都彭韬 发表于 2012-11-4 11:19
因为中的 tk 是局部变量

我这样改了一下,

那如果用while的时候tk是什么变量啊?
回复 使用道具 举报
本帖最后由 都彭韬 于 2012-11-4 12:24 编辑
邢晏玮 发表于 2012-11-4 11:22
那如果用while的时候tk是什么变量啊?

tk 当然是 Tick t = new Tick(); 的成员变量呀
四个线程“共享” 这一个t对象的成员变量tk  。
回复 使用道具 举报
都彭韬 发表于 2012-11-4 11:26
tk 当然是 Tick t = new Tick(); 的成员变量呀
四个线程“共享” 这一个t对象的成员变量tk  ...

那是不是如果在
  1. for( ;tk>0;)

  2. 16.                {

  3. 17.                        System.out.println(Thread.currentThread().getName()+"..."+tk--);

  4. 18.                }
复制代码
不定义变量的时候他就不去自动调用tk 也就是自动调用成员变量了是吗?
回复 使用道具 举报
邢晏玮 发表于 2012-11-4 11:36
那是不是如果在不定义变量的时候他就不去自动调用tk 也就是自动调用成员变量了是吗? ...

额 ~~ tk就是成员变量啊,也就是对象的属性,还有一点就是,变量(无论什么变量)重名的话,调用的顺序是就近原则~~
        
回复 使用道具 举报
都彭韬 发表于 2012-11-4 11:46
额 ~~ tk就是成员变量啊,也就是对象的属性,还有一点就是,变量(无论什么变量)重名的话,调用的顺序是 ...

万分感谢
回复 使用道具 举报
jsfjb 中级黑马 2012-11-4 11:55:21
8#
很对,这位兄弟,貌似把局部变量和全局变量。还有点模糊。还有一个就是  在for语句中  

for(int tk = 100;tk>0;tk--)
for(tk = 100;tk>0;tk--)

这两个,您貌似分不清楚。
有int的是在for中定义的变量。
没有的是,在前面已经定义了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
陈军 中级黑马 2012-11-5 11:15:03
9#
局部变量和成员变量的问题。因为你for循环里面又搞了int tk=100;。
所以for循环里面是用的是for循环里面的变量tk。而不是成员变量。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马