java - java `wait()`等待是如何实现的?

标签 java

我问的是等待过程,而不是访问排序方法,它是最简单的形式,是带有条件退出的无限循环。

等待请求的资源消耗最少的方式是什么,这就是我问这个问题的原因。

最佳答案

Object.wait()功能是通过 JVM_MonitorWait native 方法实现的,按照 ThreadReference javadoc:

/** Thread is waiting - Object.wait() or JVM_MonitorWait() was called */
public final int THREAD_STATUS_WAIT = 4;

该方法的实现可以参见jvm.cpp并使用 ObjectSynchronizer::wait:

JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
  JVMWrapper("JVM_MonitorWait");
  Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
  JavaThreadInObjectWaitState jtiows(thread, ms != 0);
  if (JvmtiExport::should_post_monitor_wait()) {
    JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms);

    // The current thread already owns the monitor and it has not yet
    // been added to the wait queue so the current thread cannot be
    // made the successor. This means that the JVMTI_EVENT_MONITOR_WAIT
    // event handler cannot accidentally consume an unpark() meant for
    // the ParkEvent associated with this ObjectMonitor.
  }
  ObjectSynchronizer::wait(obj, ms, CHECK);
JVM_END

ObjectSynchronizer::wait 实现位于 synchronizer.cpp并委托(delegate)给 objectMonitor.cpp 中的 ObjectMonitor::wait

如果您继续深入研究,您最终将到达依赖于平台的 native Java 线程实现。在 Linux 上,这将是 libpthread.so ,它将最终处理线程状态更改。

关于java - java `wait()`等待是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265523/

相关文章:

java - 从没有客户端的输入流读取数据 "flush()"

java - 如何在 Android 上使用 PdfDocument 设置 PDF 文件大小

java - Eclipse .class 大纲查看器

java - 创建一个显示 "Please Wait"JDialog 的 swing 线程

java - 如何在ReentrantLock锁定的临界区中等待指定时间?

java - 设置MaterialSpinner的背景颜色

java - apache-camel 错误处理程序范围澄清

java - StringTokenizer、JSON 和逗号

java - 创建链表解析行麻烦

Java - 要 Set<T> 的 Json 字符串