1. 程式人生 > 其它 >Java基礎——執行緒排程

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);
      }
  }
}

四、執行緒的生命週期