【问题标题】:Why isAlive() method of Thread is declared native?为什么将 Thread 的 isAlive() 方法声明为原生?
【发布时间】:2015-02-04 09:47:53
【问题描述】:

为什么 isAlive() 方法在 Thread.java 中被声明为原生?哪个类实现了这个?我知道本机方法是在 Java 之外实现的。实现这一点的类是通过加载相应的库来加载的。但我很想知道哪个类实现了isAlive() 方法?为什么它被宣布为原生?

【问题讨论】:

  • 线程是操作系统的一部分,实际上是由操作系统实现的(假设你有本地线程)因此当你想要访问这个底层资源时,需要进行本地调用。跨度>
  • 我会这样,因为 JVM 没有实现它自己的调度程序,它使用本机操作系统线程。所以这个方法只是一些操作系统内核系统调用的包装器。
  • 投票重新打开,因为这不是完全重复,这是一个特定的问题,可以合理地回答 .
  • “实现这些的类是通过加载各自的库来加载的。但是我很想知道哪个类实现了 isAlive() 方法?”本机方法不需要由类实现。它们是本地实现的 - 通常用 C 或 C++ 实现。你到底在问什么?
  • 你的问题体现的不是一个,而是两个矛盾。如果它是本机的,则根本不是由类实现的。如果它是在“Java 之外”实现的,那么它就不会在 Java 类中实现。

标签: java multithreading


【解决方案1】:

为什么在 Thread.java 中将 isAlive() 方法声明为 native?

可能是因为它必须在本机代码中实现。可能是因为它可以在本机代码中更简单地实现。可能出于历史原因;即它在很久以前被声明为native,并且通过“修复”它来最大程度地减少潜在的中断原因。

通过查看所有平台上 Thread 的本机代码方法的 C++ 源代码,您可能会获得更多见解。但显然历史实现的源代码不可用。

哪个类实现了这个?

没有。是native

我知道本地方法是在 Java 之外实现的。实现这一点的类是通过加载相应的库来加载的。

显然它不是Java类那么......

但实际上,该库可能链接到核心 java 可执行文件,而不是动态加载。

但是我很想知道哪个类实现了 isAlive() 方法?

Ermm ...您是在谈论 C++ 类吗?它将取决于平台。许多原生类在 Windows、Linux 和 Solaris(我猜现在可能还有 Mac)的代码库中有不同的版本。

如果你真的很好奇,我建议你从 OpenJDK Mercurial repos 中查看代码,或者下载源包并搜索。不幸的是,OpenJDK 项目没有为存储库提供一个非常方便的基于 Web 的源代码浏览器。 (所以即使我为你找到了它,我也无法给你一个稳定的链接。)

为什么它被宣布为原生?

你在重复自己。 (但是 Java 类没有被声明为 native。Java 方法是......)

【讨论】:

  • 是的,我说的是 C++ 类或任何提供其实现的程序。不过还是谢谢你的总结。
  • @ParagJ: 下载openjdk源码看看
  • Re,“正确的同步可能很棘手”。不只是棘手,不可能! isAlive() 的名称具有误导性:如果您调用 t.isAlive() 并且它返回 true,那么 not 是否意味着线程 t 处于活动状态。这意味着线程在 isAlive() 方法调用之前或期间的某个时刻活动的,但它不能保证线程在你的时候仍然是活动的调用者根据返回值采取一些行动。
  • @jameslarge - 我忘记了那个误导性的名称/语义。显然,正在设置的(假设的)变量和实际启动的线程之间存在竞争。在本机代码中执行 isAlive 可能会让他们避免这种情况。
猜你喜欢
  • 2023-03-24
  • 2012-12-02
  • 1970-01-01
  • 2010-10-13
  • 2012-06-29
  • 2023-03-13
  • 2013-03-28
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多