(一) Java多線程詳解之建立線程的兩種方式,java多線程
多線程
在過去單CPU時代單任務在一個時間點只能執行單一程式,之後發展到多任務階段電腦能在同一時間點並存執行多任務或多進程,雖然並不是真正意義上的”同一時間點”而是多個任務或進程共用一個CPU,並交由作業系統來完成多任務間對CPU的運行切換,以使得每個任務都有機會獲得一定的時間片運行。隨著多任務對軟體開發人員帶來的新挑戰,程式不在能假設獨佔所有的CPU時間及所有的記憶體和其他電腦資源,一個好的程式榜樣是在其不再使用這些資源時對其進行釋放以使得其他程式能有機會使用這些資源,再後來發展到多線程技術使得在一個程式內部能擁有多個線程並存執行。一個線程的執行可以被認為是一個CPU在執行該程式,當一個程式運行在多線程下就好像有多個CPU在同時執行該程式。然而在現代的電腦伴隨著多核CPU的出現,也就意味著不同的線程能被不同的CPU核得到真正意義的並存執行
多線程帶來了如下幾個優點
1.程式響應更快2.資源使用率更好3.程式設計在某些情況下更簡單
線程的建立與啟動繼承Thread類重寫run方法
public class MyThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName() + ":繼承Thread類方式建立線程"); } public static void main(String[] args) { Thread thread = new MyThread(); thread.start(); }}
實現Runnable介面重寫run方法
public class MyRunnable implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + ":實現Runnable介面方式建立線程"); } public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); }}
以上兩種方式都可以建立線程且最終效果相同,不過大部分人更傾向於使用實現Runnable介面方式,主要原因是:其一實現Runnable介面是更加符合物件導向思想,線程分為兩部分一是線程對象二是線程任務;其二線程池可以有效管理實現了Runnable介面的線程,如果線程池滿了新的線程就會排隊等候執行直到線程池空閑出來為止,而如果線程是通過實現Thread子類實現的這將會複雜一些;其三Java語言為單繼承多實現
線程提高篇線程建立和執行順序
public class ThreadExample { public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread("線程名" + i) { public void run() { System.out.println("Thread: " + getName() + "running"); } }.start(); } }}測試結果:Thread: 線程名0runningThread: 線程名2runningThread: 線程名1runningThread: 線程名3runningThread: 線程名4running
儘管啟動線程的順序是有序的但是執行的順序並非是有序的,線程執行順序是由JVM和作業系統一起決定的
線程內部執行流程分析
public class ThreadExample2 { public static void main(String[] args) { new Thread(new Runnable() { public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("runnable :" + Thread.currentThread().getName()); } }) { public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread :" + Thread.currentThread().getName()); } }.start(); }}
運行以上代碼輸出結果為:thread :Thread-0
因為線程的start方法最終是調用Thread的run方法,代碼如下
public void run() { if (target != null) { target.run(); }}
從代碼上可以看出如果target對象不為空白則運行target對象的run方法(target為通過new Thread(Runnable target)構造傳入的Runnable對象),但是此處Thread的run方法已經被重寫,所以不會再執行Runnable執行個體中的run方法
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。