首先,一个非常愚蠢的问题,我只是想知道等待‘停车’是什么意思?线程是在等待驻留,还是刚刚被驻留,因此处于等待状态?当停车发生时,占用了多少cpu/内存资源?放置线程的目的是什么?
其次,通过查看java thread API中的park方法
除非许可可用,否则
会出于线程调度的目的禁用当前线程。
如果许可可用,则它将被使用,调用将立即返回;否则,当前线程将出于线程调度的目的而被禁用,并处于休眠状态,直到发生以下三种情况之一。
英语不是我的主要语言,所以我在理解这一点上有一些困难,我本打算将“许可”作为一种“驻留线程的许可”,所以下面的问题:
谢谢
发布于 2011-09-21 18:14:54
允许表示继续执行的权限。停车意味着暂停执行,直到获得许可证为止。
与Semaphore
的许可不同,LockSupport
的许可与线程相关联(即,许可被给予特定的线程),并且不会累积(即,每个线程只能有一个许可,当线程使用许可时,它将消失)。
您可以通过调用unpark()
来为线程提供许可。线程可以通过调用park()
来暂停其执行,直到许可可用(或者线程被中断,或者超时过期等等)。当许可可用时,驻留的线程使用它并退出park()
方法。
发布于 2015-01-05 14:44:02
根据java Thread State Documentation,线程可以进入等待状态有三个原因:
没有超时的
的
当您在Thread上调用park方法时,它会出于线程调度的目的禁用该线程,除非许可可用。您可以调用unpark方法来使给定线程的许可证可用(如果它还不可用)。
所以,当你的线程在LockSupport.park中处于等待模式时,它会将你显示为正在等待(停车)。
请注意,您只能在当前线程上调用park。这是实现生产者-消费者设计模式的非常有用的机制。
发布于 2018-08-10 21:49:50
让我在阅读文档时无法绕过这个问题的部分是:
如果许可证可用,那么它将被使用,并且调用立即返回...
那么,当许可证“可用”时,谁以及如何使其可用,从而可以立即使用它?这在某种程度上很容易发现:
public static void main(String[] args) {
Thread parkingThread = new Thread(() -> {
System.out.println("Will go to sleep...");
sleepTwoSeconds();
System.out.println("Parking...");
// this call will return immediately since we have called LockSupport::unpark
// before this method is getting called, making the permit available
LockSupport.park();
System.out.println("After parking...");
});
parkingThread.start();
// hopefully this 1 second is enough for "parkingThread" to start
// _before_ we call un-park
sleepOneSecond();
System.out.println("Un-parking...");
// making the permit available while the thread is running and has not yet
// taken this permit, thus "LockSupport.park" will return immediately
LockSupport.unpark(parkingThread);
}
private static void sleepTwoSeconds() {
try {
Thread.sleep(1000 * 2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void sleepOneSecond() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
代码不言而喻,thread
正在运行,但还没有调用LockSupport.park
,而其他一些线程在它上面调用LockSupport.unpark
-从而使许可证可用。在此之后,我们调用LockSupport.park
,它会立即返回,因为许可证是可用的。
如果你将你的线程暴露给一些你不能控制的代码,而这些代码在你park
之后调用LockSupport.unpark
--它可能不能工作。
https://stackoverflow.com/questions/7497793
复制相似问题