1. 程式人生 > 實用技巧 >Java實現多執行緒的三種方式(1) ------繼承Thread類

Java實現多執行緒的三種方式(1) ------繼承Thread類

1、繼承Thead類

 1 package com.cn.donleo.thread.impl;
 2 
 3 /**
 4  * @author liangd
 5  * date 2020-10-31 15:29
 6  * code 繼承Thread類
 7  */
 8 public class MyThreadByThread extends Thread {
 9 
10     /**
11      * 構造方法,繼承父類可直接super
12      *
13      * @param name
14      */
15     MyThreadByThread(String name) {
16 super(name); 17 } 18 19 @Override 20 public void run() { 21 for (int i = 0; i < 50; i++) { 22 System.out.println("第" + i + "個 MyThread: " + getName()); 23 } 24 } 25 }

2、測試類

 1 package com.cn.donleo.thread.impl;
 2 
 3 /**
 4  * @author liangd
5 * date 2020-10-31 15:35 6 * code 測試Thread 7 */ 8 public class TestThread { 9 10 /** 11 * 一、步驟 12 * 1、定義 Thread 類的子類 並重寫該類的 Run 方法,該 run 方法的方法體就代表了該執行緒需要完成的任務 13 * 14 * 2、建立 Thread 類的例項,即建立了執行緒物件 15 * 16 * 3、呼叫執行緒的 start 方法來啟動執行緒 17 * 18 * 二、start和run方法的區別
19 * 1、start 20 * 用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。 21 * 通過呼叫Thread類的 start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行, 22 * 一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容, 23 * Run方法執行結束,此執行緒隨即終止。 24 * 2、run 25 * run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒, 26 * 其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼, 27 * 這樣就沒有達到寫執行緒的目的。 28 * 29 * 3、直接執行run方法 30 * myThread.run(); 31 * 結果表示對建立的物件進行方法的呼叫,而沒有開啟執行緒,等於普通方法 32 * start方法,開啟執行緒,是由cpu去自動分配執行緒呼叫 33 * 4、為什麼要重寫run方法? 34 * run方法是用來封裝執行的程式碼 35 * @param args 36 */ 37 public static void main(String[] args){ 38 MyThreadByThread thread1 = new MyThreadByThread("執行緒1"); 39 MyThreadByThread thread2 = new MyThreadByThread("執行緒2"); 40 41 //執行緒執行,如果直接呼叫,相當於普通方法,沒有開啟執行緒,按順序執行 42 // thread1.run(); 43 // thread2.run(); 44 //執行緒就緒,執行順序有CPU呼叫,順序會發生變化,可以設定執行優先順序 45 thread1.start(); 46 thread2.start(); 47 /* 48 執行緒生命週期: 49 1、執行緒建立(new) 50 新建立了一個執行緒物件 51 2、執行緒就緒(Runnable) 52 1)執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。 53 2)該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取CPU的使用權 54 3)有執行資格,但是沒有執行權力,但可以開始搶CPU的使用權力 55 3、執行緒執行(Running) 56 就緒狀態的執行緒獲取了CPU,執行程式程式碼 57 4、執行緒阻塞(Blocked) 58 阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。 59 直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種 60 (一)等待阻塞:執行的執行緒執行wait()方法,JVM會把該執行緒放入等待池中。(wait會釋放持有的鎖) 61 (二)同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把該執行緒放入鎖池中 62 (三)其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了I/O請求時, 63 JVM會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時, 64 執行緒重新轉入就緒狀態。(注意,sleep是不會釋放持有的鎖) 65 5、執行緒死亡(Dead) 66 執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期 67 */ 68 } 69 }