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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐强 中级黑马   /  2012-11-1 13:57  /  1267 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐强 于 2012-11-1 16:38 编辑

刚发现个有趣的问题
  1. import java.io.*;
  2. import java.lang.Thread;


  3. class MyThread extends Thread{
  4.   public int x = 0;

  5.   public void run(){
  6.     System.out.println(++x);
  7.   }
  8. }

  9. class R implements Runnable{
  10.   private int x = 0;
  11.   public void run(){
  12.     System.out.println(++x);
  13.   }
  14. }
复制代码
  1. public class Test {
  2.   public static void main(String[] args) throws Exception{
  3.    
  4.     for(int i=0;i<10;i++){
  5.       Thread t = new MyThread();
  6.       t.start();
  7.     }
  8.     Thread.sleep(10000);//让上面的线程运行完成
  9.     R r = new R();
  10.     for(int i=0;i<10;i++){
  11.       Thread t = new Thread(r);
  12.       t.start();
  13.     }
  14.   }
  15. }
复制代码
为什么上面10个线程打印的是10个1,而下面10个线程打印的却是1到10呢?

评分

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

查看全部评分

1 个回复

倒序浏览
我的理解:
for(int i=0;i<10;i++){
      Thread t = new MyThread();
      t.start();
    }
这是循环10次创建新的线程,每个线程对象里的x是不一样的且都被初始化成0,打印++x,所以输出10个1
=======================
R r = new R();
    for(int i=0;i<10;i++){
      Thread t = new Thread(r);
      t.start();
    }
而这种循环10次创建线程对象的方式,他们所调用是同一个变量x,x值在R类型对象新建时被赋值0,接着10个打印++x的线程依次进行,所以打印的是1-10。
==================
所以如果需要对共享数据操作,最好用实现Runnable接口的方式来实现多线程。

评分

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

查看全部评分

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