概念:LockSupport是用来创建锁和其他同步类的基本线程阻塞原语;
LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程。
线程的等待和唤醒机制
3种让线程等待和唤醒的方法
方式1:Object类的wait()方法让线程等待; Object类的notify()方法唤醒线程
方式2:使用JUC包中的Condition的await()方法让线程等待,使用signal()方法唤醒线程
方式3:LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程
相关案例:
方式1 wait() 和 notify()的使用
package com.topdawn.juctest.locksupport;
/**
* wait notify 方法
* wait和notify方法必须要在同步块或者方法里面,且成对出现使用
* 先wait后notify才OK
*/
public class ObjectWaitNotify {
public static void main(String[] args) {
Object objLock = new Object();
new Thread(() -> {
synchronized (objLock){
System.out.println(Thread.currentThread().getName() + " come in ");
try {
objLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 被唤醒 ");
}
}, "t1").start();
new Thread(() -> {
synchronized (objLock){
objLock.notify();
System.out.println(Thread.currentThread().getName() + "---进行唤醒操作--");
}
}, "t2").start();
}
}
方式2:await和signal()的使用
package com.topdawn.juctest.locksupport;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 在lock、unlock对里面才能正确的调用condition中线程等待和唤醒的方法
* 一定要先await后signal
*/
public class ConditionAwaitSignal {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
new Thread(() -> {
lock.lock();
System.out.println(Thread.currentThread().getName() + " come in ");
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
System.out.println(Thread.currentThread().getName() + " 被唤醒 ");
}, "t1").start();
new Thread(() -> {
lock.lock();
try {
condition.signal();
System.out.println(Thread.currentThread().getName() + "---进行唤醒操作--");
}finally {
lock.unlock();
}
}, "t2").start();
}
}
方式3:park() 和 unpark()的使用
package com.topdawn.juctest.locksupport;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
/**
* 1.直接使用,没有锁块的要求
* 2.先放行,在上锁,同样支持
* 3.park unpark成双成对的使用
*/
public class LockSupportParkUnpark {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " come in ");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + " 被唤醒 ");
}, "t1");
t1.start();
try{ TimeUnit.SECONDS.sleep(1); }catch(InterruptedException e){ e.printStackTrace(); }
new Thread(()->{
LockSupport.unpark(t1);
System.out.println(Thread.currentThread().getName() + "---进行唤醒操作--");
},"t2").start();
}
}