一、線程的兩種調度模型: 1.分時調度模型:所有線程輪流使用CPU的使用權,平均分配每個線程占用CPU的時間片 2.搶占式調度模型:優先讓優先順序高的線程使用CPU,如果線程的優先順序相同,那麼會隨機選擇一個,優先順序高的線程獲取的CPU時間片相對多一點(Java使用的就是搶占式調度模型) 為什麼說搶占式 ...
一、線程的兩種調度模型:
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);
}
}
}
四、線程的生命周期