Leo*_*rdo 82 java multithreading
首先,一个非常愚蠢的问题,我只是想知道等待的"停车"意味着什么?线程是等待停放还是刚停放,因此处于等待状态?当停车发生时,需要多少CPU /内存资源?停放线程的目的是什么?
其次,通过在java线程API中查看park方法
除非许可证可用,否则禁用当前线程以进行线程调度.
如果许可证可用,那么它被消耗并且呼叫立即返回; 否则当前线程因线程调度而被禁用,并且在发生三件事之一之前处于休眠状态.....
英语不是我的主要语言,所以我很难理解,我打算"允许"作为"允许停放线程",所以接下来的问题:
谢谢
axt*_*avt 32
许可是指继续执行的权限.停车意味着暂停执行,直到获得许可.
与Semaphore许可证不同,许可证LockSupport与线程相关联(即允许给予特定线程)并且不会累积(即每个线程只能有一个许可证,当线程消耗许可证时,它会消失).
您可以通过调用给线程许可unpark().线程可以通过调用暂停其执行,直到permit可用(或线程被中断,或超时到期等)park().当许可证可用时,停放的线程使用它并退出park()方法.
根据java Thread State Documentation,一个线程可以进入WAITING状态,原因有三个:
当您在线程上调用park方法时,除非许可证可用,否则它会禁用线程以进行线程调度.您可以调用unpark方法为给定线程提供许可证(如果尚未提供).
因此,当您的Thread通过LockSupport.park处于WAITING模式时,它将显示为WAITING(停车).
请注意,您只能在当前线程上调用park.这是实现Producer-Consumer Design Pattern的非常有用的机制.
让我重新审视这个在阅读文档时无法解决的问题的部分是:
如果许可证可用,那么它就会被消耗并且调用立即返回......
那么,当许可证“可用”时,谁以及如何提供它,以便它可以立即被消耗?找出这一点在某种程度上是微不足道的:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
代码不言自明,正在thread运行但尚未调用LockSupport.park,而其他一些线程调用LockSupport.unpark它 - 从而使许可证可用。之后我们打电话LockSupport.park,由于许可证可用,所以会立即返回。
一旦你想到这一点,这有点危险,如果你将你的线程暴露给一些你无法控制的代码,并且该代码在LockSupport.unpark你park之后调用 - 它可能不起作用。