Java 學習(27)---(多執行緒 / Runnable 介面 / 排程和優先順序)
多執行緒
1 .概念
多執行緒:一個應用程式有多條執行路徑程序:正在執行的應用程式
執行緒:程序的執行單元,執行路徑
單執行緒:一個應用程式只有一條執行路徑
多執行緒:一個應用程式有多條執行路徑
多程序的意義 ---提高 CPU 的使用率
多執行緒的意義 ---提高應用程式的使用率
提示 :Java程式的執行原理及 JVM 的啟動是多執行緒的嗎 ?
A:Java命令去啟動 JVM, JVM 會啟動一個程序,該程序會啟動一個主執行緒。
B:JVM 的啟動是多執行緒的, 因為它最低有兩個執行緒啟動了, 主執行緒和垃圾回收執行緒。
2 .多執行緒的實現方案
1.繼承 Thread 類,2.重寫 run 方法;
API:
public final String getName(): 獲取執行緒的名稱
public final void setName(String name) :設定執行緒的名稱
public static Thread currentThread(): 返回正在執行的執行緒物件
public final int getPriority() :返回執行緒物件的優先順序
public final void setPriority(int newPriority) :更改執行緒的優先順序
public final void join() :等待該執行緒執行完畢。
public static void sleep(long millis) :執行緒休眠
public static void yield(): 暫停當前正在執行的執行緒物件,並執行其他執行緒
(讓多個執行緒的執行更和諧,但是不能靠它保證一人一次。)
public final void setDaemon(boolean on): 將該執行緒標記為守護執行緒或使用者執行緒。
當正在執行的執行緒都是守護執行緒時, Java 虛擬機器退出。該方法必須在啟動執行緒前呼叫。
public final void stop() :讓執行緒停止,過時了,但是還可以使用。
public void interrupt(): 中斷執行緒,把執行緒的狀態終止,並丟擲一個 InterruptedException
publicclass MyThread extends Thread {
@Override publicvoid run() {
System.out.println(" 好好學習,天天向上 ");
// 一般來說,被執行緒執行的程式碼肯定是比較耗時的。所以我們用迴圈改進
for ( int x = 0; x < 200; x++) { System. out .println(x);
}
}
}
建立執行緒物件--- MyThread my = new MyThread();
啟 動 線 程---my.run();
呼叫 run() 方法為什麼是單執行緒的呢 ?
因為 run() 方法直接呼叫其實就相當於普通的方法呼叫 , 所以你看到的是單執行緒的效果,
要想看到多執行緒的效果,就必須說說另一個方法: start()
面試題: run() 和start() 的區別 ?
run(): 僅僅是封裝被執行緒執行的程式碼,直接呼叫是普通方法
start(): 首先啟動了執行緒,然後再由 jvm 去呼叫該執行緒的 run() 方法。
/MyThread my = new MyThread();
my.start();
IllegalThreadStateException: 非法的執行緒狀態異常 為什麼呢 ?
因為這個相當於是 my執行緒被呼叫了兩次。而不是兩個執行緒啟動 my.start();
建立兩個執行緒物件
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
3.實現 Runnable 介面,實現 run 方法
publicclass MyRunnable implements Runnable {
@Override publicvoid run() {
for ( int x = 0; x < 100; x++) {
// 由於實現介面的方式就不能直接使用Thread 類的方法了 , 但是可以間接的使用
System. out .println(Thread.currentThread().getName()+ ":" +x);
}
}
}
// 建立 MyRunnable 類的物件
MyRunnable my = new MyRunnable();
// 建立 Thread 類的物件,並把C步驟的物件作為構造引數傳遞
Thread(Runnable target)
Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
t1.setName("三體");
t2.setName("大劉");
Thread(Runnable target, String name);
Thread t1 = new Thread(my,"三體");
Thread t2 = new Thread(my, "劉意");
t1.start();
t2.start();
4.執行緒的排程和優先順序問題
執行緒的排程
a:分時排程:所有執行緒輪流使用 CPU 的使用權,平均分配每個執行緒佔用 CPU 的時間片。
b:搶佔式排程 (Java採用的是該排程方式 )
優先讓優先順序高的執行緒使用 CPU,如果執行緒的優先順序相同, 那麼會隨機選擇一個,優先順序高的執行緒獲取的 CPU 時間片相對多一些。
獲取和設定執行緒優先順序
執行緒優先順序高僅僅表示執行緒獲取的 CPU 時間片的機率高,但是要在次數比較多,或者多次執行的時候才能看到比較好的效果。
預設是 5 / 範圍是 1-10