黑马程序员技术交流社区

标题: 多线程 开启方式 [打印本页]

作者: 毛羚杨    时间: 2014-2-13 12:50
标题: 多线程 开启方式
在多线程中当我们创建了一个线程以后(继承Thread类,如下代码),我们可以直接通过调用Thread的start();方法启动线程,但是也可以直接调用run()方法 请问:调用run和调用start有什么区别




class Demo extends Thread
{
        private String name;
        Demo(String name)
        {
                super(name);
                //this.name = name;
        }
        public void run()
        {
                for(int x=0; x<10; x++)
                {
                        //for(int y=-9999999; y<999999999; y++){}
                        System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName());
                }
        }
}




class ThreadDemo2
{
        public static void main(String[] args)
        {

               
//                Thread t1 = new Thread();

                Demo d1 = new Demo("你好");
                Demo d2 = new Demo("hello");
                d1.start();//开启线程,调用run方法。
               
                d2.start();
                System.out.println("over...."+Thread.currentThread().getName());
        }
}



作者: kira    时间: 2014-2-13 13:14
本帖最后由 kira 于 2014-2-13 13:18 编辑

因为调用run是为了复写继承线程或者实现runnable中的run方法
而通过run方法调用的只是主线程并不是建立的一个新线程 默认名为Thread-数字
我把你的代码修改了下
  1. public class TT {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.       new Thread(new Dee("你好 s")).start();//调用strat
  8.       new Thread(new Dee("hello r")).run();//调用run
  9.         }

  10. }
  11. class Dee implements Runnable
  12. {
  13.         private String name;
  14.         Dee(String name)
  15.         {
  16.                 this.name=name;
  17.                
  18.         }
  19.         public void run()
  20.         {
  21.                 for(int x=0; x<10; x++)
  22.                 {
  23.                     
  24.                         System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName());
  25.                 }
  26.         }
  27. }
复制代码

证明这个方法并不能自己开辟线程 所以启动线程都用start而且这个方法在api里还不是定义在线程那块的
作者: 毛羚杨    时间: 2014-2-13 14:01
kira 发表于 2014-2-13 13:14
因为调用run是为了复写继承线程或者实现runnable中的run方法
而通过run方法调用的只是主线程并不是建立的一 ...

明白了 也就是说调用的run()方法不是多线程的方法而是普通的方法的调用 ,要想实现多线程就只有使用start()方法来开启线程
作者: 奋斗的小胖子    时间: 2014-2-13 14:25
run是开启线程而没有调用,而start是开启并且调用线程
作者: 菠萝鱼    时间: 2014-2-13 14:35
学习了 顶一下




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