LockSupport park unpark的执行时序和生效关系

一个unpark,可以抵消过去的一个park或者将来的一个park。
多个unpark,可以抵消过去的多个park。
多个unpark,不可以抵消将来的多个park。

package cn.zh.t1;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

public class T3 {
    private static class Task extends Thread{
        private Thread other;
        public void run(){
            try {
                other.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("in one park");
            LockSupport.park();
            System.out.println("out one park");
        }
    }

    public static void main(String[] args) {
        Task t1=new Task();
        t1.other=Thread.currentThread();
        t1.start();
        System.out.println("Main invoke unpark");
        LockSupport.unpark(t1);
        System.out.println("Main invoke unpark ok");
    }

}

main 线程创建并启动t1线程,执行unpark,在t1线程 other.join() 确保main线程执行完毕,才会继续执行main.join()之后的代码,确保main线程的unpark 优先 t1线程的park。输出可以看出 unpark是生效的。

Main invoke unpark
Main invoke unpark ok
in one park
out one park

Process finished with exit code 0

 

你可能感兴趣的:(thread)