首頁 > 軟體

你真的瞭解Java的多執行緒方法嗎

2022-03-29 13:04:24

Java 多執行緒方法詳解

start

start方法 啟動執行緒 在start方法中呼叫start0方法,而start0是一個本地方法,其底層是C++實現的。

    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }
    private native void start0();

run

run 方法 子執行緒的執行體,在其方法體中編寫執行緒邏輯,run方法和普通成員方法一樣,可以重複呼叫,當我們單獨呼叫run方法時會在當前執行緒中執行run方法,並不會啟動新執行緒。

yield

yield方法執行緒讓步暫停當前執行緒的執行,並讓步於其他同優先順序的執行緒,讓其他執行緒先執行

yield方法是Thread類中的靜態方法

public static native void yield();

特點

  • yield方法的讓步,能讓正在執行的執行緒由“執行狀態”進入到“就緒狀態”,等待排程執行。
  • yield僅僅是讓出CPU資源,讓給誰,是有系統決定的,系統會讓其他相同優先順序或者是更高優先順序的執行緒來獲取執行權,要是沒有更高優先順序的執行緒,會繼續執行原來的執行緒。

join

join 方法 執行緒合併 暫停當前執行緒的執行,等待子執行緒執行完畢再繼續執行當前執行緒,也叫做執行緒插隊,join方法做的事情就是講並行或並行執行的執行緒合併為序列執行。

程式碼範例:

public class ThreadMethod02 {
    public static void main(String[] args) throws InterruptedException {
        T2 t2 = new T2();
        t2.start();
        //主執行緒列印
        int count = 0;
        for (int i = 1; i <= 10; i++) {
            Thread.sleep(1000);
            System.out.println("main" + i);
            if (++count == 5) {
                t2.join();//子執行緒插隊
            }
        }
    }
}
class T2 extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            try {
                Thread.sleep(1000);//休眠一秒鐘
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("A" + i);
        }
    }
}

執行結果:

sleep

sleep執行緒休眠,在sleep期間,執行緒執行狀態從執行進入到阻塞狀態,會讓出CPU的執行權,當執行緒被重新喚醒時,會由阻塞狀態進入到就緒狀態,等待CPU的使用權

方法介紹:

  • sleep方法主要有兩個,sleep(long millis)sleep(long millis, int nanos)兩個方法功能類似,後一個方法提供更高精度的納秒級控制。
  • sleep方法是Thread裡提供的靜態方法,當前的方法也是可以丟擲InterruptedException異常,可以被Interrupt中斷掉。

Interrupt

程式碼範例:

Interrupt中斷執行緒 interrupt方法呼叫僅僅修改了一箇中斷標誌。 如果當前執行緒是可中斷的狀態(呼叫了sleep、join、wait等方法導致執行緒進入阻塞狀態)在其他執行緒中呼叫interrupt方法,會立即丟擲一個InterruptedException異常,來停止掉中斷。如果當前處於執行狀態,呼叫interrupt方法,執行緒會繼續執行,直到發生sleep、join、wait等方法的呼叫,才會進入阻塞。

Interrupt方法在Thread類中,是一個普通方法,可以通過物件來呼叫。

public class ThreadMethod03 {
    public static void main(String[] args) throws InterruptedException {
        T3 t3 = new T3();
        t3.start();
        for (int i = 0; i < 3; i++) {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName());
        }
        t3.interrupt();//傳送中斷
    }
}
class T3 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("A");
        }
        try {
            System.out.println("進行休眠");
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName() + "被Interrupted!!!");
        }
    }
}

執行結果:

deamon

deamon 方法 守護執行緒 Java執行緒有兩種,一種是守護執行緒,一種是使用者執行緒,使用者執行緒一般使用者執行使用者級任務,一般建立的執行緒都是使用者執行緒,守護執行緒也叫做“後臺執行緒”服務於使用者執行緒,一般就是用來執行後臺任務,例如:垃圾回收就是由專門執行緒來處理的,負責垃圾回收的執行緒就是守護執行緒。

守護執行緒存在兩個方法

  • public final void setDaemon(boolean on)

設定守護執行緒,引數是true和false,true表明設定為守護執行緒, false,設定為非守護執行緒 ,預設是false。

  • public final boolean isDaemon()

判斷是否守護執行緒,返回Boolean型別

程式碼範例:

public class ThreadMethod04 {
    public static void main(String[] args) throws InterruptedException {
        T4 t4 = new T4();
        t4.setDaemon(true);//將子執行緒設定為守護執行緒
        t4.start();
        if (t4.isDaemon()) {//判斷是否是守護執行緒
            System.out.println("子執行緒是守護執行緒");
        }else {
            System.out.println("子執行緒不是守護執行緒");
        }
        for (int i = 1;i <= 5;i++) {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}
class T4 extends Thread {
    @Override
    public void run() {
        while (true) {//無限迴圈
            try {
                Thread.sleep(1000);// 休眠1s鍾
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName());
        }
    }
}

執行結果:

主執行緒結束,子執行緒同時結束

Priority

Priority執行緒優先順序,就是用來指導執行緒執行的優先權

方法介紹

  • public final void setPriority(int newPriority):設定執行緒的優先順序
  • public final int getPriority():獲取執行緒的優先順序

優先順序範圍

設定Java執行緒的優先順序,最小值為1,預設值是5,最大值是10

public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

方法特點

1. 執行緒的優先順序並不絕對,所控制的是執行的機會,優先順序高的執行緒執行的概率是比較大,而優先順序低的執行緒也並不是沒有機會,只是執行的概率會低一些。

2. 優先順序共10個優先順序,分別為1-10,數值越大,表明優先順序越高,普通的執行緒優先順序是5。

3. 執行緒的優先順序是用來指導JVM層面優先哪個執行緒執行,最終執行順序還是需要作業系統來指定。

4. 注意:程式碼最好不要依賴於優先順序執行緒,有可能會造成問題,Java中給定的優先順序並不一定嚴格按照給定優先順序執行。

程式碼範例:

public class ThreadMethod05 {
    public static void main(String[] args) {
        T5 t5 = new T5();
        t5.setPriority(10);//設定優先順序為10
        int priority = t5.getPriority();//獲取優先順序
        System.out.println(priority);
    }
}

class T5 extends Thread {
    @Override
    public void run() {
        System.out.println("A");
    }
}

執行結果:

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!

 


IT145.com E-mail:sddin#qq.com