java基礎(二十八)多執行緒一
【概念】 程序:
正在執行的程式叫做程序。比如,我開了一個QQ,那麼QQ在記憶體中就佔了一塊記憶體。
執行緒: 程序是不直接執行的,執行程式由執行緒來執行。程序只是負責分配記憶體控制元件。執行緒是執行路徑(控制單元)。 一個程序中可以多執行路徑,稱之為多執行緒 一個程序中至少要有一個執行緒
而多執行緒的執行是由cpu來切換處理的,這個切換的時間是很短的。
其實應用程式的執行都是cpu在做著快速切換完成的。這個切換是隨機的。
【多執行緒的好處和弊端】
好處:多部分程式碼同時執行
弊端:執行緒太多會影響cpu的處理效率。
【建立執行緒的方式】
方式一:繼承Thread類。
步驟: 1.定義一個類繼承Thread類 2.覆蓋Thread類中的run方法 3.直接建立Thread的子類物件建立執行緒。 4.呼叫start()方法開啟執行緒並呼叫執行緒的任務run方法執行。 class Demo extends Thread{ public void run(){ //執行的邏輯程式碼 } }
Demo d=new Demo();
d.start();
建立執行緒的目的是為了開啟一條執行路徑,去執行指定的程式碼和其他程式碼實現同時執行, 而執行的指定程式碼就是這個執行路徑的任務。jvm建立的主執行緒的任務都定義在了主函式中。 而自定義的執行緒它的任務在哪兒呢? Thread類用於描述執行緒,執行緒是需要任務的。所以Thread類也是對任務的描述。 這個任務就通過Thread類中的run方法來體現。也就是說,run方法就是封裝自定義執行緒執行任務的函式。 run方法中定義就是執行緒要執行的任務程式碼。 開啟執行緒是為了執行指定程式碼,所以只有繼承Thread類,並複寫run方法。 將執行的程式碼定義在run方法中即可。
【執行緒的名稱】
可以通過Thread的getName獲取執行緒的名稱 Thread-編號(從0開始)
Thread一建立就被編號了。
可以通過Thread.currentThread()獲取到當前正在執行的執行緒物件。
修改執行緒的名字。可以在構造方法中 呼叫的父類的構造方法,把名稱傳進去就可以了
class Demo extends Thread{
Demo(String name){ super(name);
} }
【執行緒的狀態】
ps:臨時阻塞狀態:具備執行資格,不具備執行權,正在等待執行權。
只有被cpu切換到的執行緒才有執行權,其他執行緒都是處於阻塞狀態。
sleep、wait()中的執行緒處於阻塞狀態,所以執行狀態的執行緒也有可能處於阻塞狀態
1.被建立 start(); sleep(time)、wait()-用notify()喚醒 2.執行:具備著執行資格,具備執行權---------------------------------------------》凍結 :釋放執行權的同時釋放執行資格
run方法結束
執行緒的任務結束
stop()
3.消亡
【建立執行緒的第二種方式】
1.定義Runnable介面
2.覆蓋介面中的run方法,將執行緒的任務程式碼封裝到run方法中。
3.通過Thread類建立執行緒物件,並將Runnable介面的子類物件作為Thread類的建構函式的引數傳遞。
為什麼?因為執行緒的任務都封裝在Runnable介面子類物件的run方法中。 4.呼叫執行緒物件的start方法開啟執行緒
class Demo extends Runnable{
public void run(){ for(int i=0;i<10;i++){
} }
}
main中:
Thread t=new Thread(new Runnable());
t.start();
細節:
Thread t=new Thread(new Runnable());
【使用Runnable的好處】
1.將執行緒的任務從執行緒的子類中分離出來,進行單獨的封裝。按照面向物件的思想將任務封裝成物件。
2.避免類java單繼承的侷限性。
所以,建立執行緒的第二種方式較為常用。