首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >了解java.lang.Thread.State:等待(停车)

了解java.lang.Thread.State:等待(停车)
EN

Stack Overflow用户
提问于 2011-09-21 17:48:54
回答 4查看 84K关注 0票数 99

首先,一个非常愚蠢的问题,我只是想知道等待‘停车’是什么意思?线程是在等待驻留,还是刚刚被驻留,因此处于等待状态?当停车发生时,占用了多少cpu/内存资源?放置线程的目的是什么?

其次,通过查看java thread API中的park方法

除非许可可用,否则

会出于线程调度的目的禁用当前线程。

如果许可可用,则它将被使用,调用将立即返回;否则,当前线程将出于线程调度的目的而被禁用,并处于休眠状态,直到发生以下三种情况之一。

英语不是我的主要语言,所以我在理解这一点上有一些困难,我本打算将“许可”作为一种“驻留线程的许可”,所以下面的问题:

  • 这是什么意思,什么是“许可证”,谁以及如何检查这些许可证?
  • 这是什么意思:“如果许可证是可用的,那么它就会被‘停放’吗?
  • 接下来,如果第二点是真的,那么‘停车’和‘休眠’之间有什么区别?”如果我有许可证,我可以永远停放它,如果没有,我可以让它‘休眠’?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-21 18:14:54

允许表示继续执行的权限。停车意味着暂停执行,直到获得许可证为止。

Semaphore的许可不同,LockSupport的许可与线程相关联(即,许可被给予特定的线程),并且不会累积(即,每个线程只能有一个许可,当线程使用许可时,它将消失)。

您可以通过调用unpark()来为线程提供许可。线程可以通过调用park()来暂停其执行,直到许可可用(或者线程被中断,或者超时过期等等)。当许可可用时,驻留的线程使用它并退出park()方法。

票数 40
EN

Stack Overflow用户

发布于 2015-01-05 14:44:02

根据java Thread State Documentation,线程可以进入等待状态有三个原因:

没有超时的

  1. Object.wait没有timeout
  2. LockSupport.park

  • Thread.join

当您在Thread上调用park方法时,它会出于线程调度的目的禁用该线程,除非许可可用。您可以调用unpark方法来使给定线程的许可证可用(如果它还不可用)。

所以,当你的线程在LockSupport.park中处于等待模式时,它会将你显示为正在等待(停车)。

请注意,您只能在当前线程上调用park。这是实现生产者-消费者设计模式的非常有用的机制。

票数 12
EN

Stack Overflow用户

发布于 2018-08-10 21:49:50

让我在阅读文档时无法绕过这个问题的部分是:

如果许可证可用,那么它将被使用,并且调用立即返回...

那么,当许可证“可用”时,谁以及如何使其可用,从而可以立即使用它?这在某种程度上很容易发现:

代码语言:javascript
复制
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 --它可能不能工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7497793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档