1. 程式人生 > 實用技巧 >執行緒常用的方法

執行緒常用的方法

執行緒的常用方法

  1. start()
    • 啟動當前執行緒
    • 呼叫當前執行緒的run()方法
  2. run()
    • 通常需要重寫Thread類中的此方法
    • 將建立的執行緒執行的操作宣告在此方法中
  3. currentThread()
    • 靜態方法
    • 返回執行當前程式碼的執行緒
  4. getName()
    • 獲取當前執行緒的名字
  5. setName()
    • 設定當前執行緒的名字
      • 還可以利用構造器給執行緒命名
  6. yield()
    • 釋放當前CPU的執行權,但是有可能該執行緒又搶到了CPU的執行權
  7. join()
    • 線上程A中呼叫執行緒B的join()方法,此時執行緒A進入阻塞狀態,直到執行緒B完全執行完以後,執行緒A才結束阻塞狀態
  8. sleep(long millitime)
    • 靜態方法
    • 讓當前執行緒睡眠指定的millitime毫秒,在指定的millitime時間內,當前執行緒是阻塞狀態
    • 阻塞結束後,還要等待CPU給你分配資源
  9. isAlive()
    • 判斷當前執行緒是否存活
  10. 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執行緒結束後,主執行緒結束了阻塞狀態,所以繼續執行