public class LockSupport {
//线程工具类,可以让线程在任意位置阻塞;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println(1);//先打印1
try {
Thread.sleep(1000);//停1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);//打印2
java.util.concurrent.locks.LockSupport.park("我被阻塞了");//让线程使用LockSupport的方法阻塞线程
System.out.println(3);//所以3应当是无法停下来的
});
thread.start();
Thread.sleep(5000);
//如果线程使用getBlocker之前时,就被唤醒了,那么是否还能获得内容
java.util.concurrent.locks.LockSupport.unpark(thread);
System.out.println("5秒已到");
//答案是不可以如果线程使用getBlocker之前就被唤醒了,如果在此时使用这个方法,由于线程的阻塞与唤醒时成对的,一旦当前是唤醒的,就说明
//上一次阻塞时是没有产生阻塞信息的提示的
Object blocker = java.util.concurrent.locks.LockSupport.getBlocker(thread);//使用getBlocker方法获取线程park时所记录的信息;
System.out.println(blocker);
//java.util.concurrent.locks.LockSupport.unpark(thread);//在主线程中使用unpark唤醒线程,函数内需要传入需要唤醒的线程实例;
//说明,park阻塞了线程,unpark唤醒了线程;
//notify(),unpark方法的区别?
//notify()的调用需要锁对象来调用,而unpark方法是LockSupport的静态方法,所以方法的调用是由LockSupport类来调用的;
//notify是随机唤醒一个线程,而unpark可以传入需要唤醒的线程实例。
//notify是所得一个成员方法,而unpark是java,util工具类,concurrent并发下面的Locks包下面的工具类的静态方法;简称(jucl);
// java.util.concurrent.locks.LockSupport.park();
// java.util.concurrent.locks.LockSupport.park("阻塞信息");常见的方法使用
// java.util.concurrent.locks.LockSupport.parkNanos("",12);
// java.util.concurrent.locks.LockSupport.parkUntil(12);
// java.util.concurrent.locks.LockSupport.parkUntil("12ada",12);
// java.util.concurrent.locks.LockSupport.unpark(thread);
}
}