執行緒常用的方法
阿新 • • 發佈:2020-07-21
執行緒的常用方法
- start()
- 啟動當前執行緒
- 呼叫當前執行緒的run()方法
- run()
- 通常需要重寫Thread類中的此方法
- 將建立的執行緒執行的操作宣告在此方法中
- currentThread()
- 靜態方法
- 返回執行當前程式碼的執行緒
- getName()
- 獲取當前執行緒的名字
- setName()
- 設定當前執行緒的名字
- 還可以利用構造器給執行緒命名
- 設定當前執行緒的名字
- yield()
- 釋放當前CPU的執行權,但是有可能該執行緒又搶到了CPU的執行權
- join()
- 線上程A中呼叫執行緒B的join()方法,此時執行緒A進入阻塞狀態,直到執行緒B完全執行完以後,執行緒A才結束阻塞狀態
- sleep(long millitime)
- 靜態方法
- 讓當前執行緒睡眠指定的millitime毫秒,在指定的millitime時間內,當前執行緒是阻塞狀態
- 阻塞結束後,還要等待CPU給你分配資源
- isAlive()
- 判斷當前執行緒是否存活
- getPriority()
- 用於檢查執行緒的優先順序
程式碼實現
class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 101; i++) { if (i % 2 == 0) { try { //讓當前執行緒睡眠指定的10毫秒,在指定的10時間內,當前執行緒是阻塞狀態 sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //Thread.currentThread().getName():獲取當前執行緒的名字 //Thread.currentThread().getPriority():獲取執行緒的優先順序 System.out.println(Thread.currentThread().getName() + ":" + Thread.currentThread().getPriority() + i); } if (i % 20 == 0) { //釋放當前CPU的執行權,但是有可能該執行緒又搶到了CPU的執行權 yield(); } } } //構造器,可以通過他來給執行緒命名 public MyThread(String name) { super(name); } } public class Method { public static void main(String[] args) { //利用構造器給該執行緒命名 MyThread m1 = new MyThread("Thread_1"); //利用setName給該執行緒命名 // m1.setName("Thread_1"); //設定該執行緒的優先順序 m1.setPriority(Thread.MAX_PRIORITY); //啟動當前執行緒 m1.start(); // 主執行緒命名 Thread.currentThread().setPriority(Thread.MIN_PRIORITY); Thread.currentThread().setName("主執行緒"); for (int i = 0; i < 101; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName() + ":" + Thread.currentThread().getPriority() + i); } if (i == 20) { try { //線上程A(主程序)中呼叫執行緒B(Thread_1)的join()方法,此時執行緒A進入阻塞狀態, //直到執行緒B完全執行完以後,執行緒A才結束阻塞狀態 m1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } //判斷當前執行緒是否存活 System.out.println(m1.isAlive()); } }
程式碼分析
開始執行後
Thread_1執行緒優先順序高於主執行緒
m1.start(),所以Thread_1執行緒開始執行
在Thread_1執行緒中,當i % 2 == 0 時,sleep(10);
代表該執行緒睡眠10毫秒,在這段時間中,Thread_1執行緒處於阻塞狀態
另一個執行緒主執行緒得到了CPU資源,開始執行
當主執行緒的i = 20 時
m1.join()
代表在主執行緒中呼叫Thread_1的join()方法,此時主執行緒進入阻塞狀態,直到Thread_1完全執行完以後,主執行緒才結束阻塞狀態
所以開始執行Thread_1執行緒的內容,知道Thread_1執行緒結束
Thread_1執行緒結束後,主執行緒結束了阻塞狀態,所以繼續執行