LockSupport是一个用于阻塞/唤醒线程的工具类,LockSupport和每个使用它的线程都会关联一个许可证,而且默认情况下的线程是没有这个许可证的。
LockSupport方法介绍
void park()
如果调用park()方法的线程拿到了和LockSupport关联的许可证,则会直接返回,否则会被阻塞挂起,直到调用unpark()方法后被阻塞的线程才会被恢复。
例如,下面的代码只有有两条输出语句:
当前线程调用unpark(thread)方法后...
线程thread调用park()方法前...
package juc;
import java.util.concurrent.locks.LockSupport;
/**
* @author heyunlin
* @version 1.0
*/
public class LockSupportExample {
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("线程thread调用park()方法前...");
LockSupport.park();
System.out.println("线程thread调用park()方法后...");
}
};
thread.start();
// LockSupport.unpark(thread);
System.out.println("当前线程调用unpark(thread)方法后...");
}
}
执行完代码LockSupport.park()后,子线程thread会被挂起,只有其他线程调用unpark(thread)方法,线程thread才能恢复并打印:线程thread调用park()方法后...
上面的代码取消注释之后,再次运行将会打印三次然后结束程序的运行。
void unpark(Thread)
这个方法的作用是让指定的线程获得许可证,所以先调用unpark()方法,再调用park()方法,线程并不会被挂起,而是直接返回。
例如,下面两条输出语句都会执行。
package juc;
import java.util.concurrent.locks.LockSupport;
/**
* @author heyunlin
* @version 1.0
*/
public class LockSupportExample {
public static void main(String[] args) {
Thread thread = Thread.currentThread();
LockSupport.unpark(thread);
System.out.println("当前线程调用park()方法前...");
LockSupport.park();
System.out.println("当前线程调用park()方法后...");
}
}