黑马程序员技术交流社区

标题: 如何线程启动 [打印本页]

作者: 韩伟    时间: 2012-7-13 12:37
标题: 如何线程启动
启动一个线程是用 run() 还是 start(),  这两个函数各有什么特别之处?
作者: 陆强强    时间: 2012-7-13 12:48
start():
run()只是普通的函数调用
作者: 黑马刘涛    时间: 2012-7-13 14:02
创建线程的第一种方式:继承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方法。
作者: 杨康    时间: 2012-7-13 14:10
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) {}
                }
        }
}
作者: 王飞    时间: 2012-7-13 14:17
帅哥,你还是多看看视频吧,
start(); 这个方法是开启线程的方法,一调用它,它就去执行run()方法里面的代码 ,调用一次start();那么就多一个线程。
run();   这个是每个线程启动后运行的方法,出现在Thread类的子类中和实现Runnable接口的类中


作者: 李思静    时间: 2012-7-13 15:01
run()就是普通的函数调用,执行完run()才能继续执行下面的代码的,而start()不是这样的,start()是开启一个新的线程,是跟主函数的并列关系。老毕曾经说过,画图才是这个世C:\Users\Lee\Desktop\s.png界上最好的学习方法。
作者: 耿立刚    时间: 2012-7-13 15:16

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);
    }
  }
}





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