1. 程式人生 > >Java 學習(27)---(多執行緒 / Runnable 介面 / 排程和優先順序)

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