Java LockSupport.upark()可以出现在LockSupport.park()方法之前,但在下面的代码中,为什么它会阻止代码

Java LockSupport.upark()可以出现在LockSupport.park()方法之前,但在下面的代码中,为什么它会阻止代码,java,Java,LockSupport.upark()可以出现在LockSupport.park()方法之前,但在下面的代码中,为什么它会阻止代码。在我的代码中,主线程中有4个LockSupport.unpark(t1),实际上,它只能获得一个访问权限,当我运行线程t1时,LockSupport.park()可以使用一个并返回,但它会阻止代码,为什么 public class LockSupportDemo{ public static Object u = new Object(); static Chang

LockSupport.upark()可以出现在LockSupport.park()方法之前,但在下面的代码中,为什么它会阻止代码。在我的代码中,主线程中有4个LockSupport.unpark(t1),实际上,它只能获得一个访问权限,当我运行线程t1时,LockSupport.park()可以使用一个并返回,但它会阻止代码,为什么

public class LockSupportDemo{
public static Object u = new Object();
static ChangeObjectThread t1 = new ChangeObjectThread("t1");
public static class ChangeObjectThread extends Thread{

    public ChangeObjectThread(String name)
    {
        super.setName(name);
    }

    @Override
    public void run() {
        synchronized (u)
        {

            LockSupport.park(Thread.currentThread());
            System.out.println("in "+ getName());
            if(Thread.interrupted())
            {
                System.out.println(getName()+" interrupted");
            }
        }
        System.out.println(getName() +"isOver");

    }
}

public static void main(String[] args) throws InterruptedException {
    LockSupport.unpark(t1);
    LockSupport.unpark(t1);
    LockSupport.unpark(t1);
    LockSupport.unpark(t1);
    LockSupport.unpark(t1);
    t1.start();
 }
 }

Javadoc for
LockSupport.unpark
在这方面非常明确:

使给定线程的许可证可用(如果尚未使用) 可获得的如果线程在
park
上被阻塞,则它将解除阻塞。 否则,它对
park
的下一次调用保证不会被阻塞。这 如果给定 线程尚未启动。

你上面所做的是行不通的


为了达到同样的效果,您可以启动线程,但让它等待,直到您在主线程中调用
unpark
,例如,使用
wait
/
notify
信令。或者,如果您需要一些快速而肮脏的东西(因为这似乎更多的是探索
LockSupport
,而不是编写生产代码),那么您甚至可以使用
Thread.sleep(1000)
run
方法的开始处。

再次阅读
LockSupport.unpark
的Javadoc,特别是最后一句话:如果给定线程尚未启动,则此操作不保证有任何效果。