多執行緒第一章

浪成于微澜之间發表於2024-04-20

執行緒的等待與喚醒

執行緒的join

需要在幾個執行緒執行完畢之後再執行,例如載入資源等,join方法可以讓執行緒順序執行
例如

public class Example_1 {

    public static void main(String[] args) throws InterruptedException {
        Thread threadOne = new Thread(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("執行緒1啟動");
        },"thread-1");

        Thread threadTwo = new Thread(() -> System.out.println("執行緒2啟動"),"thread -2 ");

        threadOne.start();
        threadTwo.start();

        threadOne.join();
        threadTwo.join();
        System.out.println("所有子執行緒執行完畢");
    }
}

join是thread類自帶的方法,後續更好的CountDownLatch來使用

yeild方法

yeild方法是執行緒讓出當前cpu的執行權,當前執行緒會由執行狀態轉換為就緒狀態,cpu會從就緒的執行緒中選擇一個執行緒繼續執行,程式碼示例:

public class YieldTest implements Runnable{

    public YieldTest() {
        Thread thread = new Thread(this);
        thread.start();
    }
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            if (i % 5 == 0) {
                System.out.println(Thread.currentThread() + " yield cup");
            }
            Thread.yield();
        }
        System.out.println(Thread.currentThread() + " is over");
    }
}

執行緒的中斷

執行緒死鎖

產生的原因

如何破壞死鎖

守護執行緒和使用者執行緒

java中的執行緒主要分為守護執行緒和使用者執行緒,當啟動一個main函式之後就啟動了一個使用者執行緒,JVM內部也存在很多守護執行緒,例如GC回收執行緒,他們的區別就是當最後一個非守護執行緒退出之後,JVM會正常退出,不管守護執行緒是否退出

建立守護執行緒

public class DaemonThread {
    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
           for (;;) {

           }
        });
        //設定該執行緒為守護執行緒
        thread.setDaemon(true);
        thread.start();
    }
}

ThreadLocal

ThreadLocal主要作用是建立執行緒本地變數,是變數在每個執行緒本地的一個副本

public class ThreadLocalTest {

    private static ThreadLocal<String> localVariable = new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(() -> {
            localVariable.set("thread one local variable ");
            print("threadOne");
            System.out.println("threadOne remove after" + ":" + localVariable.get());
        }).start();

        new Thread(() -> {
           localVariable.set("thread two local variable");
           print("threadTwo");
            System.out.println("threadTwo remove after" + ":" + localVariable.get());
        }).start();

    }
    
    private static void print(String str) {
        System.out.println(str + ":"+ localVariable.get());
        //清除當前執行緒的本地記憶體中的值
        localVariable.remove();
    }
}

第二節

2.1執行緒的併發與並行

相關文章