標籤:耦合 綁定 重寫 有一個 執行個體 ann 構造方法 介面實現 利用
1.進程與線程的關係
一個程式運行後至少有一個進程,一個進程中可以包含多個線程
2.多線程兩種實現方式
A:實現線程程式繼承Thread
/** * 定義子類,繼承Thread * 重寫run() * @author vanguard * */public class SubThread extends Thread { public void run() { for(int i = 0; i < 50; i++) { System.out.println("run..." + i); } }}
1 /** 2 * 多線程 3 * 建立和啟動一個線程 4 * 建立Thread子類對象 5 * 子類對象調用方法start() 6 * 讓線程程式執行,JVM調用線程中的run 7 * @author vanguard 8 * 9 */10 public class ThreadDemo01 {11 public static void main(String[] args) {12 //建立Thread子類對象13 SubThread st = new SubThread();14 //子類對象調用start()15 st.start();16 for(int i = 0; i < 50; i++) {17 System.out.println("main..." + i);18 }19 }20 }
B:實現線程的另一種方式實現Runnable介面
/** * 實現Runnable介面 * 重寫run() * @author vanguard * */public class SubRunnable implements Runnable { public void run() { for(int i = 0; i < 50; i++) { System.out.println("run..." + i); } }}
/** * 實現介面方式的線程 * 建立Thread對象,在構造方法中傳遞Ruannable介面實作類別對象 * 調用Thread的start() * @author vanguard * */public class ThreadDemo01 { public static void main(String[] args) { SubRunnable sr = new SubRunnable(); Thread t = new Thread(sr); t.start(); for(int i = 0; i < 50; i++) { System.out.println("main..." + i); } }}
3.多線程兩種實現方式的區別
實現Runnable介面的方式,更加的符合物件導向,線程分為兩部分,一部分線程對象,一部分線程任務。
繼承Thread類,線程對象和線程任務耦合在一起。
一旦建立Thread類的子類對象,既是線程對象,有又有線程任務。
實現runnable介面,將線程任務單獨分離出來封裝成對象,類型就是Runnable介面類型。Runnable介面對線程對象和線程任務進行解耦。
(降低緊密性或者依賴性,建立線程和執行任務不綁定)
4.線程池的原理
1).在java中,如果每個請求到達就建立一個新線程,開銷是相當大的。
2).在實際使用中,建立和銷毀線程花費的時間和消耗的系統資源都相當大,甚至可能要比在處理實際的使用者請求的時間和資源要多的多。
3).除了建立和銷毀線程的開銷之外,活動的線程也需要消耗系統資源。
如果在一個jvm裡建立太多的線程,可能會使系統由於過度消耗記憶體或“切換過度”而導致系統資源不足。
為了防止資源不足,需要採取一些辦法來限制任何給定時刻處理的請求數目,儘可能減少建立和銷毀線程的次數,
特別是一些資源耗費比較大的線程的建立和銷毀,盡量利用已有對象來進行服務。
線程池主要用來解決線程生命週期開銷問題和資源不足問題。通過對多個任務重複使用線程,
線程建立的開銷就被分攤到了多個任務上了,而且由於在請求到達時線程已經存在,
所以消除了線程建立所帶來的延遲。這樣,就可以立即為請求服務,使用應用程式響應更快。
另外,通過適當的調整線程中的線程數目可以防止出現資源不足的情況。
4.線程的生命週期
建立(new Thread)
當建立Thread類的一個執行個體(對象)時,此線程進入建立狀態(未被啟動)。
例如:Thread t1=new Thread();
就緒(runnable)
線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();
運行(running)
線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先順序更高的線程進入,線程將一直運行到結束。
死亡(dead)
當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。
自然終止:正常運行run()方法後終止
異常終止:調用stop()方法讓一個線程終止運行
堵塞(blocked)
由於某種原因導致正在啟動並執行線程讓出CPU並暫停自己的執行,即進入堵塞狀態。
正在睡眠:用sleep(long t) 方法可使線程進入睡眠方式。一個睡眠著的線程在指定的時間過去可進入就緒狀態。
正在等待:調用wait()方法。(調用motify()方法回到就緒狀態)
被另一個線程所阻塞:調用suspend()方法。(調用resume()方法恢複)
Java學習之多線程一