天天看點

Java并發程式設計知識點總結(十三)——LockSupport方法總結

文章目錄

    • (一)、LockSupport概述
    • (二)、LockSupport常用方法
    • (三)、LockSupport使用方法

(一)、LockSupport概述

我們在前面分析ReentrantLock以及Condition通信機制的時候多次使用到LockSupport.park()以及LockSupport.unpark()方法。LockSupport是用來阻塞線程的工具,park()方法用來阻塞線程,unpark()方法用來喚醒線程。

LockSupport是不支援重入的,每一條線程都會對應一個許可,如果這個許可可用,調用park()方法就不會發生阻塞。但是如果不可用,調用park()方法就會發生線程阻塞,這時就可以使用unpark()方法來擷取許可。

(二)、LockSupport常用方法

方法 功能
void park() 阻塞目前線程,如果調用unpark方法或者目前線程被中斷,從能從park()方法中傳回
void park(Object blocker) 功能同方法1,入參增加一個Object對象,用來記錄導緻線程阻塞的阻塞對象,友善進行問題排查
void parkNanos(long nanos) 阻塞目前線程,最長不超過nanos納秒,增加了逾時傳回的特性
void parkNanos(Object blocker, long nanos) 功能同方法3,入參增加一個Object對象,用來記錄導緻線程阻塞的阻塞對象,友善進行問題排查
void parkUntil(long deadline) 阻塞目前線程,知道deadline
void parkUntil(Object blocker, long deadline) 功能同方法5,入參增加一個Object對象,用來記錄導緻線程阻塞的阻塞對象,友善進行問題排查
void unpark(Thread thread) 喚醒處于阻塞狀态的指定線程

(三)、LockSupport使用方法

public static void main(String[] args) {
        //線程1
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                System.out.println("執行park方法前");
                LockSupport.park();
                System.out.println("執行park方法後");
            }
        };
		//線程2
        Thread thread2 = new Thread() {
            @Override
            public void run() {
                System.out.println("執行unpark方法前");
                LockSupport.unpark(thread1);
                System.out.println("執行unpark方法後");
            }
        };
        thread1.start();
        thread2.start();
    }
           
Java并發程式設計知識點總結(十三)——LockSupport方法總結

在上面的例子中,我們利用線程1和線程2分别調用park()以及unpark()方法。

參考文章:LockSupport工具

繼續閱讀