学习LockSupport类中通过part()和unpart()方法来实现阻塞和唤醒线程
1、使用part()和unpart()线程等待和唤醒情况,且无锁块要求
public static void main(String[] args) {
Thread parkThread = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "t" + "parkThread come in");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + "t" + "parkThread out");
}, "parkThread");
parkThread.start();
try{TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();} // 延迟3秒
Thread unparkThread = new Thread(() -> {
LockSupport.unpark(parkThread);
System.out.println(Thread.currentThread().getName() + "t" + "unparkThread unpark");
}, "unparkThread");
unparkThread.start();
}
运行结果:parkThread parkThread come in
unparkThread unparkThread unpark
parkThread parkThread out
2、尝试先执行unpart()方法, 后执行part()方法来唤醒线程
public static void main(String[] args) {
Thread parkThread = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "t" + "parkThread come in");
try{TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();} // 延迟3秒
LockSupport.park();
System.out.println(Thread.currentThread().getName() + "t" + "parkThread out");
}, "parkThread");
parkThread.start();
Thread unparkThread = new Thread(() -> {
LockSupport.unpark(parkThread);
System.out.println(Thread.currentThread().getName() + "t" + "unparkThread unpark");
}, "unparkThread");
unparkThread.start();
}
运行结果:parkThread parkThread come in
unparkThread unparkThread unpark
parkThread parkThread out
总结:可以看出,LockSupport线程等待和唤醒没有wait()和notify方法那样的同步代码块,也没有像await()和singnal()方法那样的锁块,也能够正常运行,且不受顺序的影响。LockSupport在AQS中运用较多,有兴趣的同学可以看看源码。



