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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余清兰 中级黑马   /  2012-6-26 11:08  /  2500 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余清兰 于 2012-6-26 12:36 编辑

看到毕老师的视频用的while循环方法把100张票卖完了,我自已用for来实现,创建了三个线程实现,就是在定义的x的时候出了点问题,是不是x=100这个值不能定义在局部变量里了,三个线程就不能共享执行了?如果要这样写,怎么改善?有点不明白为什么这样不行?
  1. package org.demo;
  2. class sale implements Runnable
  3. {
  4. int x;
  5. public void run()
  6. {
  7. for (int x=100;x>0 ;x-- )
  8. {
  9. this.x = x;
  10. System.out.println(Thread.currentThread().getName()+x);
  11. }
  12. }
  13. }
  14. class TestSaleDemo
  15. {
  16. public static void main(String[] args)
  17. {
  18. sale s = new sale();
  19. Thread t1 = new Thread(s);
  20. Thread t2 = new Thread(s);
  21. Thread t3 = new Thread(s);
  22. t1.start();
  23. t2.start();
  24. t3.start();
  25. }
  26. }
复制代码

8 个回复

倒序浏览
public void run()
{
    int x;
    for (int x=100;x>0 ;x-- )
   {
       this.x = x;
       System.out.println(Thread.currentThread().getName()+x);
   }
前面你已经声明了int x,在for循环中你又再次声明了int x,这是不允许的,一个变量在一个函数范围内只允许声明一次。
此外x不是成员变量,怎么能有this.x=x呢?
回复 使用道具 举报
票数要定义成static类型的  private static ticket=100;
它作为共享数据,不能写成局部变量
这样多个对象就可以操作同个资源了,不会发生多人买到同一张票的情况.
回复 使用道具 举报
你声明了两个局部变量x,这样写语法错误。
回复 使用道具 举报
本帖最后由 黑马-唐磊 于 2012-6-26 11:29 编辑

楼主那个程序有明显的错误
int x;
for (int x=100;x>0 ;x-- )
{
this.x = x;
这里显然不能这么写,要么把int x去掉,要么把for循环里面的int去掉,另外this.x=x调用显然没有意义所以得去掉
回复 使用道具 举报
{:soso_e127:}不好意思大家,我是要把int x定义在成员位置上,最开始写错了,现在改过来了
回复 使用道具 举报
葛奎 发表于 2012-6-26 11:20
票数要定义成static类型的  private static ticket=100;
它作为共享数据,不能写成局部变量
这样多个对象 ...

定义静态的不是最佳方式,不适用,静态生命周期太长。
回复 使用道具 举报
首先,多线程同时操作共享数据是,应该线程同步,并且如果你一定要用for语句,不应该再定义局部变量给成员变量x(共享数据)赋值,这样做的话,每个新启动的线程都会从第100张票开始卖,实际上重复售票了.
建议如下修改:
class sale implements Runnable
{
int x=1000;
        public  void run()
        {
                for (; x>0; )
                {
               
                synchronized(this){//同步代码块,同步操作共享数据的代码,保证结果正确

                System.out.println(Thread.currentThread().getName()+"---"+(x--));
                }
                }
        }
       
               
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 余清兰 于 2012-6-26 17:27 编辑
周兴中 发表于 2012-6-26 12:07
首先,多线程同时操作共享数据是,应该线程同步,并且如果你一定要用for语句,不应该再定义局部变量给成员变量x ...


哦谢谢,知道了,这个synchronized方法受用了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马