版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 https://blog.csdn.net/dmw412724/article/details/83149142
一个好用的东西.阻塞和释放线程用的.
先看代码:
public static void aaa() {
System.out.println("阻塞开始");
LockSupport.park();
System.out.println("111");
}
park()就是执行线程一直阻塞,111根本不会执行.
再看这个代码:
public static void aaa() {
System.out.println("阻塞开始");
LockSupport.unpark(Thread.currentThread());
LockSupport.park();
System.out.println("111");
}
这个111是会执行的.
原理:
LockSupport和关联的每一个线程都有一个许可permit.这个许可permit只有0 和1 两个值.默认是0.
unpark ---> permit =1;
park ----> if (permit == 0){
阻塞
}
if (permit ==1){
permit = 0;
}
也就是说,
1.无论如何unpark会将permit设置为1.
2.如果permit = 0,线程阻塞.
3.如果permit =1 ,park会将permit = 0
看看下面这个发令枪的小案例吧.和countDownLatch有些类似.
public static void aaa() throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ready!!!");
LockSupport.park();//阻塞
System.out.println("go!!!!");
}
});
t.start();// 启动时阻塞
// 3秒后执行发放通行证
Thread.sleep(3000);
LockSupport.unpark(t);
}
处于park状态的线程怎么离开park状态?javadoc如是说:
1.被unpark
2.被interrupts
3.虚假返回??