Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程等待()=>;此 路 不通?_Java_Concurrency - Fatal编程技术网

Java线程等待()=>;此 路 不通?

Java线程等待()=>;此 路 不通?,java,concurrency,Java,Concurrency,根据本文,调用wait()将导致线程处于阻塞状态。然而,这段代码将导致(在被调用后)线程处于等待状态 class bThread extends Thread { public synchronized void run() { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } 我

根据本文,调用wait()将导致线程处于阻塞状态。然而,这段代码将导致(在被调用后)线程处于等待状态

class bThread extends Thread {
    public synchronized void run() {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
我有什么不对劲吗?有人能向我解释一下这种行为吗?
任何帮助都将不胜感激

等待就是什么都不做的时候。Blocked是指它试图重新开始运行,但尚未被允许运行。

线程正在等待通知。然后,它将被阻止尝试重新进入同步区域,直到所有其他线程都离开

您发布的链接中的相关部分(关于等待):

例如,在对象上调用Object.wait()的线程正在等待另一个线程调用该对象上的Object.notify()或Object.notifyAll()

和(关于封锁):

处于阻止状态的线程正在等待监视器锁[…]在调用Object.wait后重新输入同步块/方法


最后一部分发生在线程尝试从wait()返回时,但直到那时才发生。

您在哪里看到它这样说的

在您链接的同一页中,它明确指出

等待将在Object.wait()之后


进入synchronized(同步)前将被阻止。监视器一次执行一个线程。假设您有T1-T10线程,9个线程是
阻塞的
,一个线程是
可运行的
。每隔一段时间,监视器就会选择一个新线程来运行。发生这种情况时,所选/当前线程(如T1)从
RUNNABLE
变为
BLOCKED
。然后另一个线程,比如T2,从
BLOCKED
转到
RUNNABLE
,成为当前线程

当其中一个线程需要另一个线程提供某些信息时,可以使用
wait()
。在这种情况下,线程将被标记为
等待
,直到它被
notify()
ed。因此,等待的线程在此之前不会被监视器执行。例如,等待有要卸载的箱子。当这种情况发生时,装箱子的人会通知我

换句话说,
BLOCKED
WAITING
都是非活动线程的状态,但是
WAITING
线程如果不先转到
BLOCKED
就不能
运行<代码>等待
线程“不希望”变为活动状态,而
被阻止的
线程“希望”变为活动状态,但不能变为活动状态,因为轮到它们了


我认为。

作为提醒,您应该始终在while循环中调用wait(),等待进入同步区域/关键部分的条件。这是因为Java有“虚假唤醒”(本质上,线程可以在任何时候无缘无故地唤醒)。

这里有一些令人困惑的术语。 当线程对对象调用wait时,它将进入wait状态。 当线程等待获取锁时,它们属于该锁的等待集,但它们处于阻塞状态


令人困惑,但不知何故,这是有道理的

哦,我知道是什么让你困惑了。“BLOCKED=>或在调用对象后重新输入同步块/方法。请稍候。”。。请注意“重新输入同步块”侧注:您应该将等待调用与条件相关联。这是否意味着被阻止的线程处于循环中以获得锁?aka处于阻塞状态的线程会占用cpu时间?@user2807219:不,通常不会。线程将位于保护同步区域的互斥体的就绪队列中,就像调用被另一个线程锁定的同步函数一样。锁争用的主要成本通常是在程序上强制进行上下文切换(即在CPU中存储和恢复正在运行的线程的状态),这是相对昂贵的。这应该是一个注释。这与OP无关