Java创建线程的两种方法

大多数情况,通过实例化一个Thread对象来创建一个线程。Java定义了两种方式:

  • 实现Runnable 接口;
  • 可以继承Thread类。

下面的两小节依次介绍了每一种方式。

实现Runnable接口

创建线程的最简单的方法就是创建一个实现Runnable 接口的类。Runnable抽象了一个执行代码单元。你可以通过实现Runnable接口的方法创建每一个对象的线程。为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明如下:
    public void run( )
在run()中可以定义代码来构建新的线程。理解下面内容是至关重要的:run()方法能够像主线程那样调用其他方法,引用其他类,声明变量。仅有的不同是run()在程序中确立另一个并发的线程执行入口。当run()返回时,该线程结束。

在你已经创建了实现Runnable接口的类以后,你要在类内部实例化一个Thread类的对象。Thread 类定义了好几种构造函数。我们会用到的如下:
    Thread(Runnable threadOb, String threadName)
该构造函数中,threadOb是一个实现Runnable接口类的实例。这定义了线程执行的起点。新线程的名称由threadName定义。

建立新的线程后,它并不运行直到调用了它的start()方法,该方法在Thread 类中定义。本质上,start() 执行的是一个对run()的调用。 Start()方法声明如下:
    void start( )

下面的例子是创建一个新的线程并启动它运行:

 1 // Create a second thread.
 2 class NewThread implements Runnable {
 3     Thread t;
 4     NewThread() {
 5         // Create a new, second thread
 6         t = new Thread(this, "Demo Thread");
 7         System.out.println("Child thread: " + t);
 8         t.start(); // Start the thread
 9     }
10
11     // This is the entry point for the second thread.
12     public void run() {
13         try {
14             for(int i = 5; i > 0; i--) {
15                 System.out.println("Child Thread: " + i);
16                 Thread.sleep(500);
17             }
18         } catch (InterruptedException e) {
19             System.out.println("Child interrupted.");
20         }
21         System.out.println("Exiting child thread.");
22     }
23 }
24
25 class ThreadDemo {
26     public static void main(String args[]) {
27         new NewThread(); // create a new thread
28         try {
29             for(int i = 5; i > 0; i--) {
30                 System.out.println("Main Thread: " + i);
31                 Thread.sleep(1000);
32             }
33         } catch (InterruptedException e) {
34            System.out.println("Main thread interrupted.");
35         }
36         System.out.println("Main thread exiting.");
37     }
38 }

在NewThread 构造函数中,新的Thread对象由下面的语句创建::
    t = new Thread(this, "Demo Thread");
通过前面的语句this 表明在this对象中你想要新的线程调用run()方法。然后,start() 被调用,以run()方法为开始启动了线程的执行。这使子线程for 循环开始执行。调用start()之后,NewThread 的构造函数返回到main()。当主线程被恢复,它到达for 循环。两个线程继续运行,共享CPU,直到它们的循环结束。该程序的输出如下:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

如前面提到的,在多线程程序中,通常主线程必须是结束运行的最后一个线程。实际上,一些老的JVM,如果主线程先于子线程结束,Java的运行时间系统就可能“挂起”。前述程序保证了主线程最后结束,因为主线程沉睡周期1000毫秒,而子线程仅为500毫秒。这就使子线程在主线程结束之前先结束。简而言之,你将看到等待线程结束的更好途径。

扩展Thread

创建线程的另一个途径是创建一个新类来扩展Thread类,然后创建该类的实例。当一个类继承Thread时,它必须重载run()方法,这个run()方法是新线程的入口。它也必须调用start()方法去启动新线程执行。下面用扩展thread类重写前面的程序:

 1 // Create a second thread by extending Thread
 2 class NewThread extends Thread {
 3     NewThread() {
 4         // Create a new, second thread
 5         super("Demo Thread");
 6         System.out.println("Child thread: " + this);
 7         start(); // Start the thread
 8     }
 9
10     // This is the entry point for the second thread.
11     public void run() {
12         try {
13             for(int i = 5; i > 0; i--) {
14                 System.out.println("Child Thread: " + i);
15                 Thread.sleep(500);
16             }
17         } catch (InterruptedException e) {
18             System.out.println("Child interrupted.");
19         }
20         System.out.println("Exiting child thread.");
21     }
22 }
23
24 class ExtendThread {
25     public static void main(String args[]) {
26         new NewThread(); // create a new thread
27         try {
28             for(int i = 5; i > 0; i--) {
29                 System.out.println("Main Thread: " + i);
30                 Thread.sleep(1000);
31            }
32         } catch (InterruptedException e) {
33             System.out.println("Main thread interrupted.");
34         }
35         System.out.println("Main thread exiting.");
36     }
37 }

该程序生成和前述版本相同的输出。子线程是由实例化NewThread对象生成的,该对象从Thread类派生。注意NewThread 中super()的调用。该方法调用了下列形式的Thread构造函数:
    public Thread(String threadName)
这里,threadName指定线程名称。

选择合适方法

到这里,你一定会奇怪为什么Java有两种创建子线程的方法,哪一种更好呢。所有的问题都归于一点。Thread类定义了多种方法可以被派生类重载。对于所有的方法,惟一的必须被重载的是run()方法。这当然是实现Runnable接口所需的同样的方法。很多Java程序员认为类仅在它们被加强或修改时应该被扩展。因此,如果你不重载Thread的其他方法时,最好只实现Runnable 接口。这当然由你决定。然而,在本章的其他部分,我们应用实现runnable接口的类来创建线程。

转自微学苑(http://www.weixueyuan.net/view/6027.html)

时间: 2024-10-13 17:31:06

Java创建线程的两种方法的相关文章

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

Java 创建线程的两种方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

Java创建线程的两个方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

创建线程的两种方法

第一种:继承Thread类 子类覆写父类的run方法,将线程代码写在run()中. 建立子类对象,些时线程也被创建了. 通过start方法启动线程. 第二种:实现Runnable接口 子类覆盖接口的run方法,将线程代码写在run()中. 通过Thread类创建线程,并将实现Runnable接口的子类对象作为参数传递给Thread类的构造函数. Thread对象调用start方法启动线程. 两者的比较: 继承Thread类,相对简单,但因为单继承的局限性,同份资源不共享,而不建议使用:而实现Ru

43.创建线程的两种方法

public class Test { public static void main(String[] args) { MyThread mt = new MyThread(); // 实例化线程对象 mt.start();// 启动线程 } } // 通过继承Thread类来创建线程 class MyThread extends Thread { private int count = 0; public void run() { while (count < 100) { count++;

java 创建线程的三种方法Callable,Runnable,Thread比较及用法

转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是, (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得 (3)call方法可以抛出异常,run方法

Java创建线程的两种方式

方式 继承Thread类 实现Runnable方法 实例 #继承Thread类 public class ThreadTest2 extends Thread { private int threadCnt = 10; @Override public void run() { while (true) { if (threadCnt > 0) { System.out.println(Thread.currentThread().getName() + " 剩余个数 " + t

创建线程的两种方法,继承Thread,继承Runnable

继承Thread 1 package thread; 2 //继承Thread 3 public class TestThread { 4 public static void main(String[] args) { 5 //run()方法由CPU调用:分线程 6 MyThread thread=new MyThread(); 7 thread.start(); 8 //主线程 9 String name=Thread.currentThread().getName();//得到所在线程的名

【 Thread】创建线程的2种方法

(一)Thread类 1.结构 java.lang.Object |---java.lang.Thread 2.创建线程的两种方法 (1)一种方法是将类声明为Thread的子类,该子类应重写Thread类的run方法 class PrimeThread extends Thread {          long minPrime;          PrimeThread(long minPrime) {              this.minPrime = minPrime;