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