文章目錄
-
- (一)、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();
}
在上面的例子中,我們利用線程1和線程2分别調用park()以及unpark()方法。
參考文章:LockSupport工具