黑马程序员技术交流社区

标题: 请教多线程的问题 [打印本页]

作者: 余清兰    时间: 2012-6-26 11:08
标题: 请教多线程的问题
本帖最后由 余清兰 于 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. }
复制代码

作者: 张_涛    时间: 2012-6-26 11:17
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呢?
作者: 葛奎    时间: 2012-6-26 11:20
票数要定义成static类型的  private static ticket=100;
它作为共享数据,不能写成局部变量
这样多个对象就可以操作同个资源了,不会发生多人买到同一张票的情况.
作者: 车风波    时间: 2012-6-26 11:22
你声明了两个局部变量x,这样写语法错误。
作者: 黑马-唐磊    时间: 2012-6-26 11:24
本帖最后由 黑马-唐磊 于 2012-6-26 11:29 编辑

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

定义静态的不是最佳方式,不适用,静态生命周期太长。
作者: 周兴中    时间: 2012-6-26 12:07
首先,多线程同时操作共享数据是,应该线程同步,并且如果你一定要用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--));
                }
                }
        }
       
               
}
作者: 余清兰    时间: 2012-6-26 12:34
本帖最后由 余清兰 于 2012-6-26 17:27 编辑
周兴中 发表于 2012-6-26 12:07
首先,多线程同时操作共享数据是,应该线程同步,并且如果你一定要用for语句,不应该再定义局部变量给成员变量x ...


哦谢谢,知道了,这个synchronized方法受用了。




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