黑马程序员技术交流社区

标题: 关于多线程的一点问题....新问题提问 [打印本页]

作者: 黄金龙    时间: 2013-1-17 13:45
标题: 关于多线程的一点问题....新问题提问
本帖最后由 黄金龙 于 2013-1-17 16:01 编辑
  1. /*
  2. 多线程的实例
  3. */
  4. class Demo11
  5. {
  6.         public static void main(String[] args)
  7.         {        
  8.                 moreThread t = new moreThread();
  9.                 new Thread( new moreThread()).start();
  10.                 new Thread( new moreThread()).start();
  11.                 new Thread( new moreThread()).start();
  12.           }
  13. }

  14. class moreThread implements Runnable
  15. {        
  16.         public  int x=100;//这里不允许加static
  17.         
  18.         public void run()
  19.                 {
  20.                         while(x>=1)
  21.                         {
  22.                                 System.out.println(Thread.currentThread().getName()+"----"+x--);
  23.                         }
  24.                

  25.         }
  26. }
复制代码
需求改下面的代码....public  int x=100;//这里不允许加static

怎样整到他能够不重复

thread.jpg (23.34 KB, 下载次数: 59)

thread.jpg

作者: 肖亚光    时间: 2013-1-17 14:55
我怎么感觉有名字的调用 不用static 更好理解呢  而且顺序打印 这不好理解么
就启动一个线程,该线程运行run()方法里面的代码 当然x是一直有效的了
作者: 刘军亭    时间: 2013-1-17 15:08
本帖最后由 刘军亭 于 2013-1-17 15:12 编辑

问题:如果上面是匿名的调用的话..下面必须加static..这样就不会重复..这点就好理解
       如果上面有名字的调用的话..下面可以不static...这里也不重复.....咋理解
我觉得你说的重复跟匿不匿名没有多大关系,要想不重复,就得对你的run()方法加同步锁


作者: 黄金龙    时间: 2013-1-17 15:23
刘军亭 发表于 2013-1-17 15:08
问题:如果上面是匿名的调用的话..下面必须加static..这样就不会重复..这点就好理解
       如果上面有名字 ...

之前没看到那个地方.
作者: 黄金龙    时间: 2013-1-17 15:27
张向辉 发表于 2013-1-17 14:53
不太理解你的问题

共享数据的问题......现在加个同步锁就得了....之前的问题是堆栈存放变量的问题....
作者: 刘军亭    时间: 2013-1-17 15:28
好好学习,共同努力吧,我也是申请黑马的选手
作者: 黄金龙    时间: 2013-1-17 15:57
刘军亭 发表于 2013-1-17 15:28
好好学习,共同努力吧,我也是申请黑马的选手

呵呵.在看视频呢.
作者: 黄锦成    时间: 2013-1-17 16:50
只创建一个moreThread 对象就可以了。建议你回去看线程的视频
作者: 高浩    时间: 2013-1-18 14:33
你的多线程出现了安全问题,多个个线程操作了共享数据(x),需要同步来解决安全问题,
将操作数据的代码( System.out.println(Thread.currentThread().getName()+"----"+x--);)
用同步代码块包起来但一但用同步代码块需要一把锁,这个锁可以使任意对象。但要保证多个线程用同一个锁
像这样:
ojbject obj=new object();
while(x>=1)
{
synchronized (obj)
{
            System.out.println(Thread.currentThread().getName()+"----"+x--);
}
}
作者: 朱玉玺    时间: 2013-1-18 16:53
要想不重复,你要解决两个问题:
1,资源唯一,不能每个线程都有个启动后都有 int x,加static 就解决问题了。
2.多线程处理同一个资源时,容易出现安全问题,所以需要同步,synchronized加锁就ok啦。
可以这样定义:
  1. class Res//资源类
  2. {
  3.     public static int x;
  4. }
复制代码
然后把资源,通过线程类的构造函数传进去,用Res作为锁。




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