黑马程序员技术交流社区

标题: 启动一个线程是用run()还是start()? [打印本页]

作者: 鸭梨的生活    时间: 2014-5-19 13:18
标题: 启动一个线程是用run()还是start()?
。。。。。。。。。。。。。。。
作者: 鸭梨的生活    时间: 2014-5-19 13:20
一起学习。。。。。。。。。
作者: 雨落千木的时节    时间: 2014-5-19 13:34
启动线程使用start()方法,run()方法是存储自定义线程代码块的,类似于main方法!
作者: 彭飞    时间: 2014-5-19 13:37
run()方法和start()方法的作用域是不同的

首先回答你,  start()是启动线程
而run()是 某线程的方法,该线程的功能被包含在里面。

给你一个比喻,

挖掘机,
每一台挖掘机就是一个线程,想要启动线程就得使用start()来给挖掘机点火启动,
而run()是挖掘机拥有的功能,是在之前已经封装到挖掘机内部的。
start()启动挖掘机,挖掘机能干嘛, 就得看run()里有什么功能。

联想一下,,
这个例子同样解释了什么是进程,什么是线程,
一个进程至少有一个线程,
那么,挖掘某一块地,可以看作是一个进程, 而一台或者多台挖掘机就是进程里的线程。
一台电脑里有多个进程,而一个工程有多个分项,这里这个进程就是挖掘作用,而多台挖掘机的工作,就是多线程。
作者: 曲佳奇    时间: 2014-5-19 14:41

  1. public class Test1{
  2.         public static void main(String[] args) {
  3.                 Demo d = new Demo();
  4.                 d.start();
  5. //d.run();
  6.                 for (int i = 0; i < 10; i++) {
  7.                         System.out.println("Main run----"+i);
  8.                 }
  9.         }
  10. }
  11. class Demo  extends Thread{
  12.         public void run(){
  13.                 for (int i = 0; i < 10 ; i++) {
  14.                         System.out.println("Demo run----"+i);
  15.                 }
  16.         }
  17. }
复制代码
使用run()的话 就如同直接调用对象方法 程序会直接运行完run()方法后再执行下面的for循环 线程创建了 并未启动 还是单线程  
使用start() 会启动线程 再调用run()   结果会交替输出



作者: 段兆洋    时间: 2014-5-19 15:26
run ()只是封装代码的一个方法而已,start()才能启动线程!
作者: 927233671    时间: 2014-5-19 15:30
当然是用start(),run()只是调用你的run方法,并没有启动新线程(控制单元)。
作者: 张鹏宇    时间: 2014-5-19 15:33
当然是start
作者: saheru    时间: 2014-5-19 16:19
start()方法是启动(即开辟)一个线程的方法,因此线程的启动必须通过此方法,
而run()方法,只是Thread类的一个方法,它本身并不能开辟线程。
所以,当你用run()时候,程序只有一个线程,根本没达到你多线程的目的(是错误的)。而你用start()时候,你的程序又开辟了两个线程,所以结果不同

作者: youcyou    时间: 2014-5-19 20:35
start是开启线程的,run是运行内容
作者: 张志民    时间: 2014-5-19 20:45
当然是start run中放的是同步任务
作者: amao    时间: 2014-5-20 01:40
创建一个线程时,如果是自定义线程,需要定义一个类继承Thread,覆盖run方法。启动线程时,调用start方法,会自动调用run方法。
作者: alax    时间: 2014-5-20 03:14
启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体。
继承Thread类的启动方式:
public class ThreadStartTest {
    public static void main(String[] args) {
        ThreadTest tt = new ThreadTest();// 创建一个线程实例
         tt.start();  // 启动线程
    }
}
实现Runnable接口的启动方式:
public class RunnableStartTest {
    public static void main(String[] args) {
       Thread t = new Thread(new RunnableTest());    // 创建一个线程实例
        t.start();  // 启动线程
    }
}
作者: 路漫漫_求索    时间: 2014-5-20 13:11
启用线程,会先调用start()方法,然后再调用run()方法.
run方法只是对象中的一个方法,如果线程没有被开启,是不会运行的

class DemoThread extends Thread
{
        public void run()
        {
                for(int i=0;i<60;i++)
                {
                        System.out.println("Hello World"+i);
                }
        }
}
public class _08多线程 {
       
        public static void main(String[]args)
        {
                DemoThread d = new DemoThread();
                d.start();//开启线程,并执行该线程的run方法
               
                //d.run();仅仅是对象调用方法,而线程创建了,并没有运行。
               
                for(int i=0;i<70;i++)
                {
                        System.out.println("Run....."+i);
                }
        }
       

}


作者: 诺忔。初禾、    时间: 2014-5-20 13:25
调用start()




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