在寫一個很小很小的網頁面監控程序的時候須要使用到java的多線程,在網上簡單看了一下,使用了一下,簡單總結一下以備之後使用。 java
java程序的多線程組織有兩種方式:實現Runnable接口和繼承Thread。 多線程
1. 實現Runnable接口: spa
// 實現Runnable接口 class MyThreadRunner implements Runnable { public void run() { System.out.println("Thread running!"); } }啓動方式:
// 實現Runnable接口方式的線程啓動 MyThreadRunner runner = new MyThreadRunner(); Thread thread = new Thread(runner); thread.start();
2. 繼承Thread類方式: 線程
// 繼承Thread class MyThread extends Thread { public void run() { System.out.println("Thread running!"); } }啓動方式:
// 實現Thread接口方式的線程啓動 MyThread myThread = new MyThread(); myThread.start();3. 二者的區別與相同點:
其實從本質上來講,二者都是同樣的。無論使用哪一種方式,能夠看到都須要建立一個Thread對象(或子類對象),而在通過查看Thread源碼,能夠看到其實Thread其實已經實現了Runnable接口,因此咱們能夠大膽的想象一下,線程是這樣子的:在啓動一個新的線程後,線程都會自動的去執行Thread對象中Runnable接口的run方法;繼承Thread類的方式,實際上是重寫Thread類實現的run方法而已;而實現Runnable接口的方式,則是直接替換Thread對象(子對象)中的target屬性(Runnable類型的); code
相對來講,實現Runnable的話更方便實現多線程間的資源共享,由於建立線程的target屬性指向的是同一個Runnable實現類對象。 對象
Thread類反編源碼片斷: 繼承
public class Thread implements Runnable { ...... /* What will be run. */ private Runnable target; ...... public void run() { if (target != null) { target.run(); } } ...... }線程Demo完整代碼:
package tutorial.example; public class ThreadDemo { public static void main(String[] args) { // 實現Runnable接口方式的線程啓動 MyThreadRunner runner = new MyThreadRunner(); Thread thread = new Thread(runner); thread.start(); // 實現Thread接口方式的線程啓動 MyThread myThread = new MyThread(); myThread.start(); } } // 實現Runnable接口 class MyThreadRunner implements Runnable { public void run() { System.out.println("Thread running!"); } } // 繼承Thread class MyThread extends Thread { public void run() { System.out.println("Thread running!"); } }