Java基礎——執行緒排程
阿新 • • 發佈:2022-04-13
一、執行緒的兩種排程模型:
1.分時排程模型:所有執行緒輪流使用CPU的使用權,平均分配每個執行緒佔用CPU的時間片
2.搶佔式排程模型:優先讓優先順序高的執行緒使用CPU,如果執行緒的優先順序相同,那麼會隨機選擇一個,優先順序高的執行緒獲取的CPU時間片相對多一點(Java使用的就是搶佔式排程模型)
為什麼說搶佔式排程模型多執行緒的執行具有隨機性?
假設某臺計算機只有一個CPU,那麼CPU在某一個時刻只能執行一條指令,執行緒只有得到CPU時間片,也就是使用權才能執行指令,所以多執行緒程式執行是具有隨機性的,因為不確定誰可以搶到CPU的使用權
二、Thread類中設定和獲取執行緒優先順序的方法
設定優先順序:public final void setPriority(int newpriority):更改此執行緒優先順序
獲取執行緒優先順序:public final int getPriority():返回此執行緒的優先順序
//優先順序從1-10,數字越大,優先順序越高
//優先順序從1-10,數字越大,優先順序越高
//執行緒預設的優先順序是5,範圍是1-10
//優先順序越高只是代表獲得CPU時間片的機率高,並不能確保優先順序高的執行緒全部領先完成
public class MyThreadDemo {
public static void main(String[] args) {
MyThread mt=new MyThread("兔子");
MyThread mt1=new MyThread("烏龜");
//public final int getPriority():返回此執行緒的優先順序
// System.out.println(mt.getPriority());
// System.out.println(mt.getPriority());
//public final void setPriority(int newpriority):更改此執行緒優先順序
mt.setPriority(10);//優先順序從1-10,數字越大,優先順序越高
mt.setPriority(1);//優先順序從1-10,數字越大,優先順序越高
//優先順序越高只是代表獲得CPU時間片的機率高,並不能確保優先順序高的執行緒全部領先完成
mt.start();
mt1.start();
}
}
三、執行緒控制
方法名 | 說明 |
---|---|
static void sleep(long millis) | 使得當前正在執行的執行緒停留(暫停執行)所設定的毫秒數 |
void join() | 等待這個執行緒的死亡 |
void setDaemon(boolean on) | 將此執行緒標記為守護執行緒,當執行的執行緒都是守護執行緒時,Java虛擬機器將退出 |
sleep方法程式碼
public class ThreadSleep extends Thread {
//無參,帶參構造
public ThreadSleep(){}
public ThreadSleep(String name){
super(name );
}
//重寫run方法
@Override
public void run() {
for (int i=0;i<100;i++){
//使用getName()獲取執行緒名稱
System.out.println(getName()+":"+i);
//讓執行緒每次執行完畢就休眠1000毫秒
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
* static void sleep(long millis)使得當前正在執行的執行緒停留(暫停執行)所設定的毫秒數*/
public class ThreadSleepDemo {
public static void main(String[] args) {
MyThread mt=new MyThread("張三");
MyThread mt1=new MyThread("李四");
MyThread mt2=new MyThread("王五");
mt.start();
mt1.start();
mt2.start();
}
}
join方法:
作用:可以讓某一個執行緒執行完畢後再開始其他執行緒
public class ThreadJoin extends Thread{
//無參,帶參構造
public ThreadJoin(){}
public ThreadJoin(String name){
super(name );
}
//重寫run方法
@Override
public void run() {
for (int i=0;i<100;i++){
//使用getName()獲取執行緒名稱
System.out.println(getName()+":"+i);
}
}
}
public class ThreadJoinDemo {
public static void main(String[] args) {
MyThread mt=new MyThread("張三");
MyThread mt1=new MyThread("李四");
MyThread mt2=new MyThread("王五");
mt.start();
try {
mt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
mt1.start();
mt2.start();
}
}
void setDaemon(boolean on) 將此執行緒標記為守護執行緒,當執行的執行緒都是守護執行緒時,Java虛擬機器將退出
簡單來說比如有三個執行緒,一個主執行緒名字為爹,兩個執行緒名字為兒子,當把兩個兒子執行緒設定為守護執行緒後,當爹執行緒完成了任務消失後,兩個兒子執行緒不管執行到了哪裡會直接消失
public class ThreadDaemon extends Thread{
//無參,帶參構造
public ThreadDaemon(){}
public ThreadDaemon(String name){
super(name );
}
//重寫run方法
@Override
public void run() {
for (int i=0;i<100;i++){
//使用getName()獲取執行緒名稱
System.out.println(getName()+":"+i);
}
}
}
public class ThreadDaemDemo {
public static void main(String[] args) {
MyThread mt = new MyThread("兒子一");
MyThread mt1 = new MyThread("兒子二");
//設定一個主執行緒
Thread.currentThread().setName("爹");
//設定兩個守護執行緒
mt.setDaemon(true);
mt1.setDaemon(true);
mt.start();
mt1.start();
//設定主執行緒需要執行的步驟
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "," + i);
}
}
}
四、執行緒的生命週期