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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄金龙 中级黑马   /  2013-1-17 13:45  /  1996 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄金龙 于 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, 下载次数: 61)

thread.jpg

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

9 个回复

倒序浏览
我怎么感觉有名字的调用 不用static 更好理解呢  而且顺序打印 这不好理解么
就启动一个线程,该线程运行run()方法里面的代码 当然x是一直有效的了
回复 使用道具 举报
本帖最后由 刘军亭 于 2013-1-17 15:12 编辑

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

回复 使用道具 举报
刘军亭 发表于 2013-1-17 15:08
问题:如果上面是匿名的调用的话..下面必须加static..这样就不会重复..这点就好理解
       如果上面有名字 ...

之前没看到那个地方.
回复 使用道具 举报
张向辉 发表于 2013-1-17 14:53
不太理解你的问题

共享数据的问题......现在加个同步锁就得了....之前的问题是堆栈存放变量的问题....
回复 使用道具 举报
好好学习,共同努力吧,我也是申请黑马的选手
回复 使用道具 举报
刘军亭 发表于 2013-1-17 15:28
好好学习,共同努力吧,我也是申请黑马的选手

呵呵.在看视频呢.
回复 使用道具 举报
只创建一个moreThread 对象就可以了。建议你回去看线程的视频

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
高浩 中级黑马 2013-1-18 14:33:57
9#
你的多线程出现了安全问题,多个个线程操作了共享数据(x),需要同步来解决安全问题,
将操作数据的代码( System.out.println(Thread.currentThread().getName()+"----"+x--);)
用同步代码块包起来但一但用同步代码块需要一把锁,这个锁可以使任意对象。但要保证多个线程用同一个锁
像这样:
ojbject obj=new object();
while(x>=1)
{
synchronized (obj)
{
            System.out.println(Thread.currentThread().getName()+"----"+x--);
}
}

评分

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

查看全部评分

回复 使用道具 举报
要想不重复,你要解决两个问题:
1,资源唯一,不能每个线程都有个启动后都有 int x,加static 就解决问题了。
2.多线程处理同一个资源时,容易出现安全问题,所以需要同步,synchronized加锁就ok啦。
可以这样定义:
  1. class Res//资源类
  2. {
  3.     public static int x;
  4. }
复制代码
然后把资源,通过线程类的构造函数传进去,用Res作为锁。

评分

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

查看全部评分

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