黑马程序员技术交流社区

标题: java多线程一个有趣问题 [打印本页]

作者: 徐强    时间: 2012-11-1 13:57
标题: java多线程一个有趣问题
本帖最后由 徐强 于 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呢?
作者: 王永荣    时间: 2012-11-1 14:17
我的理解:
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接口的方式来实现多线程。




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