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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗雪梅 中级黑马   /  2012-10-7 12:18  /  1386 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗雪梅 于 2012-10-7 16:44 编辑

class MyThread extends Thread{
       publicvoid run(){
              try {

                     //让当前线程休眠3秒
                     Thread.currentThread().sleep(3000);
              } catch (InterruptedException e) {
              }
              System.out.println("MyThreadrunning");
       }
}

public class ThreadTest{
       publicstatic void main(String argv[]) {
              MyThread t = new MyThread();  //创建线程
             t.run();   //调用线程中的run()方法
              t.start();   //启动线程
              System.out.println("ThreadTest");
         }
}


调用线程的run()方法,和启动线程t.start()这两句话的作用不是一样的吗,都是让run()方法运行起来。但是操作语句不一样,我想应该是有本质区别的,但看半天觉得就是在调用run()方法,没有其它的不同啊

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
有不同,直接调用run()主函数就去运行run方法了。
用start()调用run方法是分出一个线程运行,主函数继续往下运行的。
回复 使用道具 举报
开启一个线程不同于普通的方法调用,都知道线程的生命周期,有新建-->排队---->执行---->(等待)----->消亡
若直接调用run方法那是方法调用,直接去运行run方法里的代码了,不是新开辟一条执行路径,因为具体这个run方法什么时候去调用由cpu来决定,当该线程获取到cpu的时间片时再执行,是随机的。这下面是start方法的源代码:
private ThreadGroup        group;
public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
       group.add(this);  //可以看成来这个线程被加入到了一个队列当中了,得等到cpu轮转到该线程时再去执行
        start0();
        if (stopBeforeStart) {
            stop0(throwableFromStop);
        }
    }
如果由我们自己直接去调用那就是一条执行路径了,因为一旦你调用了这条执行路径就不变了,不是由cpu决定的,不是随机的。

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
直接调用run()方法,那就是在主线程里执行run()方法,程序会把run()方法的代码执行完后,主线程才会再往下执行.
而通过线程来start()调用,那么就不是在主线程执行run()方法中代码,而是JVM会开启一个分支的线程来执行run()方法中的代码,主线程和分支线程会并发执行(如果是单核的,那么同一个时间点只能有一个线程执行,哪个线程先执行哪个线程后执行由CPU说了算.如果是非单核,那么在同一个时间点,就可以真正意义上的做到两个线程同时执行.).

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class MyThread extends Thread{
       publicvoid run(){
              try {

                     //让当前线程休眠3秒

                     Thread.currentThread().sleep(3000);
              } catch (InterruptedException e) {
              }
              System.out.println("MyThreadrunning");
       }
}
public class ThreadTest{
       publicstatic void main(String argv[]) {
              MyThread t = new MyThread();  
             t.run();   //这里是显式调run() 方法,是main 主线程在执行,单纯的调用这个方法,       
                // 不会启动新的线程。

              t.start();   //只有调用 Thread 类或他子类的 start() 方法,虚拟机才会去创建一个

                //新的线程,并默认在新线程里执行并调用 run() 方法体内的代码。         
               System.out.println("ThreadTest");
         }
}
        //JVM 只会用Thread 类来开启新的线程,并交予线程调度器去调度和管理,为该线程分配 CPU 资源,

        //实现 Running 接口,也是这种做法。

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
简单地说,只有调用了start方法才算开启了多线程
只调用run方法只能算是普通的调用,它跟主函数共享一个线程
回复 使用道具 举报
马镱洵 发表于 2012-10-7 13:55
直接调用run()方法,那就是在主线程里执行run()方法,程序会把run()方法的代码执行完后,主线程才会再往下执行 ...

奥,这样的
回复 使用道具 举报
谢谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马