一.繼承Thread類
為創建一個線程,最簡單的方法就是從Thread類繼承。這個類包含了創建和運行線程所需的一切東西。Thread類最重要的方法是run(),但為了使用run(),必須對其進行重寫。因此,run()屬于那些會與程序中的其他線程“并發”或“同時”執行的代碼。下面的例子是繼承Thread類的一個簡單實現。
java程序如下:
public class SimpleThread extends Thread { PRivate int countDown = 5; private int threadNumber; private static int threadCount = 0; /** * 為每個線程分配一個編號 */ public SimpleThread() { threadNumber = ++threadCount; System.out.println("Making Thread" + threadNumber); } /** * 從5到1進行計數 */ @Override public void run() { while (true) { System.out.println("Thread" + threadNumber + ":" + countDown); if (--countDown == 0) { return; } } } public static void main(String[] args) { for (int i = 0; i < 5; i++) { new SimpleThread().start(); } }}執行結果如下:
Making Thread1
Making Thread2
Making Thread3
Making Thread4
Making Thread5
Thread3:5
Thread3:4
Thread3:3
Thread3:2
Thread1:5
Thread3:1
Thread1:4
Thread1:3
Thread1:2
Thread1:1
Thread4:5
Thread4:4
Thread4:3
Thread4:2
Thread5:5
Thread5:4
Thread5:3
Thread5:2
Thread5:1
Thread2:5
Thread2:4
Thread2:3
Thread2:2
Thread2:1
Thread4:1
在main()方法中,可看到創建并運行了大量線程。Thread包含了一個特殊的方法叫做start(),它的作用是對線程進行特殊的初始化,然后調用run()。如果不調用start(),線程便永遠不會啟動。
二.實現Runnable接口
在實際開發中,一個多線程的操作很少使用Thread類,而是通過Runnable接口完成。示例如下:
java代碼如下:
public class SimpleThread implements Runnable { private int countDown = 10; /** * 從10到1進行計數 */ @Override public void run() { while (true) { synchronized(this) { if (countDown > 0) { System.out.println(Thread.currentThread().getName() + ":" + countDown--); } else { return; } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { SimpleThread sd = new SimpleThread(); for (int i = 0; i < 3; i++) { new Thread(sd).start(); } }}執行結果如下:
Thread-0:10
Thread-2:9
Thread-2:8
Thread-1:7
Thread-2:6
Thread-2:5
Thread-2:4
Thread-2:3
Thread-2:2
Thread-2:1
兩種實現方式的區別和聯系:
在程序開發中只要是多線程肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下好處:
新聞熱點
疑難解答