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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毛羚杨 中级黑马   /  2014-2-13 12:50  /  1134 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在多线程中当我们创建了一个线程以后(继承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());
        }
}


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 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里还不是定义在线程那块的

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报 1 0
kira 发表于 2014-2-13 13:14
因为调用run是为了复写继承线程或者实现runnable中的run方法
而通过run方法调用的只是主线程并不是建立的一 ...

明白了 也就是说调用的run()方法不是多线程的方法而是普通的方法的调用 ,要想实现多线程就只有使用start()方法来开启线程
回复 使用道具 举报
run是开启线程而没有调用,而start是开启并且调用线程
回复 使用道具 举报
学习了 顶一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马