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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-7-13 12:37  /  2076 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

启动一个线程是用 run() 还是 start(),  这两个函数各有什么特别之处?

6 个回复

倒序浏览
start():
run()只是普通的函数调用
回复 使用道具 举报
创建线程的第一种方式:继承Thread类。
步骤:
1,定义类继承Thread。
2,复写Thread类中的run方法。
        目的:将自定义代码存储在run方法。让线程运行。

3,调用线程的start方法,
        该方法两个作用:启动线程,调用run方法。


创建线程的第二种方式:实现Runable接口

步骤:
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。
        将线程要运行的代码存放在该run方法中。

3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
        为什么要将Runnable接口的子类对象传递给Thread的构造函数。
        因为,自定义的run方法所属的对象是Runnable接口的子类对象。
        所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。


5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。



实现方式和继承方式有什么区别呢?

实现方式好处:避免了单继承的局限性。
在定义线程时,建立使用实现方式。

两种方式区别:
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。
回复 使用道具 举报
java实现多线程有2种方法:
1扩展java.lang.Thread类
2实现java.lang.Runnable接口
例如下面的例子
class ThreadDemo implements Runnable { //实现Runnable接口
        public void run() {                                  // 实现run方法
                for (int i = 0; i < 10; i++) {         
                        System.out.println("td线程:AAAAAAAAAAAAA");
                        try {
                                Thread.sleep(2000);  //休眠2秒
                        } catch (Exception e) {}
                }
        }

        public static void main(String[] args) {
                ThreadDemo td = new ThreadDemo();
                Thread t1 = new Thread(td);
                t1.start();            //开启线程用start()方法,执行run()方法的内容
                for (int i = 0; i < 5; i++) {                          //主线程            
                        System.out.println("main线程:aaaaaaaaaa");
                        try {
                                         Thread.sleep(2000);     //休眠2秒
                        } catch (Exception e) {}
                }
        }
}
回复 使用道具 举报
帅哥,你还是多看看视频吧,
start(); 这个方法是开启线程的方法,一调用它,它就去执行run()方法里面的代码 ,调用一次start();那么就多一个线程。
run();   这个是每个线程启动后运行的方法,出现在Thread类的子类中和实现Runnable接口的类中

回复 使用道具 举报
run()就是普通的函数调用,执行完run()才能继续执行下面的代码的,而start()不是这样的,start()是开启一个新的线程,是跟主函数的并列关系。老毕曾经说过,画图才是这个世C:\Users\Lee\Desktop\s.png界上最好的学习方法。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报

1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程

2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码

而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。

举例说明一下:

记住:线程就是为了更好地利用CPU,
提高程序运行速率的!

public class TestThread1{
  public static void main(String[] args){
    Runner1 r=new Runner1();
    //r.run();//这是方法调用,而不是开启一个线程
    Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
    t.start();

    for(int i=0;i<100;i++){
      System.out.println("进入Main Thread运行状态");
      System.out.println(i);
    }
  }
}

class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
  public void run(){
    for(int i=0;i<100;i++){
      System.out.println("进入Runner1运行状态");
      System.out.println(i);
    }
  }
}

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马