Java LockSupport.upark()可以出现在LockSupport.park()方法之前,但在下面的代码中,为什么它会阻止代码
LockSupport.upark()可以出现在LockSupport.park()方法之前,但在下面的代码中,为什么它会阻止代码。在我的代码中,主线程中有4个LockSupport.unpark(t1),实际上,它只能获得一个访问权限,当我运行线程t1时,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
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,特别是最后一句话:如果给定线程尚未启动,则此操作不保证有任何效果。