黑马程序员技术交流社区

标题: 多线程的疑惑。 [打印本页]

作者: 陈世涛    时间: 2012-7-20 12:57
标题: 多线程的疑惑。
class Demo extends Thread
{
private String name;
Demo(String name)
{
  super();
  this.name = name;
}
public void run()
{
  for(int x=1; x<=10; x++)
  {
  // System.out.println(name+"---"+x+"......"+Thread.currentThread().getName());
   System.out.println(name+"---"+x+"......"+getName());
   
  }
}

}
class ThreadDemo
{
public static void main(String[] args)
{
  
  Demo d1 = new Demo("张三");
  Demo d2 = new Demo("李四");
  d1.run();
  d2.run();

}
}
针对一:
public void run()
{
  for(int x=1; x<=10; x++)
  {
  // System.out.println(name+"---"+x+":::::"+Thread.currentThread().getName());
   System.out.println(name+"---"+x+":++++++:"+getName());
   
  }
}
出现如下结果:

针对二:
public void run()
{
  for(int x=1; x<=10; x++)
  {
  System.out.println(name+"---"+x+":::::"+Thread.currentThread().getName());
  // System.out.println(name+"---"+x+":++++++:"+getName());
   
  }
}

出现如下结果:



求详解,求真相。。

2.PNG (182.94 KB, 下载次数: 32)

2.PNG

1.PNG (164.53 KB, 下载次数: 19)

1.PNG

作者: 周玉龙    时间: 2012-7-20 13:18
class Demo extends Thread
{
private String name;
Demo(String name)
{
  super();
  this.name = name;
}
public void run()
{
  for(int x=1; x<=10; x++)
  {
  // System.out.println(name+"---"+x+"......"+Thread.currentThread().getName());
   System.out.println(name+"---"+x+"......"+getName());
   
  }
}
}
class ThreadDemo
{
public static void main(String[] args)
{
  
  Demo d1 = new Demo("张三");
  Demo d2 = new Demo("李四");
  d1.start();//是通过start()方法启动线程的.你在看看视频.希望你能明白
d2.start();
//d1.run();这里只是通过创建对象的方式,调用方法并没有开启线程.你这里还是单线程.
//d2.run();

}
}



作者: 陈世涛    时间: 2012-7-20 13:19
周玉龙 发表于 2012-7-20 13:18
class Demo extends Thread
{
private String name;

嗯,谢谢呀。。。:P
作者: 周玉龙    时间: 2012-7-20 13:27
不客气的..明白了就可以了...
作者: 苑占丽    时间: 2012-7-20 13:32
class Demo extends Thread
{
private String name;
Demo(String name)
{
  super();
  this.name = name;
}
public void run()
{
  for(int x=1; x<=10; x++)
  {
  // System.out.println(name+"---"+x+"......"+Thread.currentThread().getName());
   System.out.println(name+"---"+x+"......"+getName());
   
  }
}

}
class ThreadDemo
{
public static void main(String[] args)
{
  
  Demo d1 = new Demo("张三");//此处创建了一个对象即是一个新线程,但注意:在下面的代码中,你并没有d1.start(),意思就是你并没有在创建的时候,启动它呀。所以此时主线程就会一路向下执行这一行代码d1.run(),所以不会出现张三李四的交替输出
  Demo d2 = new Demo("李四");//此处又创建了一个新对象即是另一个新线程,执行过程同上个对象。
  d1.run();
  d2.run();

}
}

作者: 王璐    时间: 2012-7-20 13:42
Demo d1 = new Demo("张三");
  Demo d2 = new Demo("李四");
  d1.run();   
  d2.run();
//d1.run()和d2.run()这是由主线程依次运行的,是单线程。你创建了线程( Demo d1= new Demo("张三"); Demo d2 = new Demo("李四");)但是并没有启动。应该是d1.start();d2.start();
作者: 张水荣    时间: 2012-7-20 17:32

  d1.run();  d2.run();//这两句都没有启动自定义的线程,只是调用了线程中的run方法,启动线程是通过start方法的
当你调用这第一个方法的时候,出现第一种情况,因为使用getName方法获得的是线程的名称;
当你调用这第二个方法的时候,出现第二种情况,因为currentThread方法获得的是当前正在执行的线程对象的引用,此引用就是main方法,所以该引用的名称也就是main






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