为什么在Thread.destroy()等公共API中包含未实现的方法?

时间:2011-08-04 23:03:40

标签: java api-design

我对这个感到有点困惑。 Java API中有一些方法,如Thread.destroy(),根本没有实现。 (我知道它没有被实现,可能是因为它会导致死锁,但这不是我所得到的。)如果它没有实现,那么为什么甚至将它包含在公共API中呢?它只是一种无用的方法,人们可以在运行时调用它来引发异常。

当你实现一个接口并且某个特定的实现由于某种原因没有实现所有方法时,我可以看到这一点。但是线程并非如此。

我唯一能想到的是,Java开发人员在早期就做出了一项设计决策,以展示计划实施的功能 - 显然,发现线程问题从未得到回报。但这是一个疯狂的猜测,它似乎有点愚蠢。

其他人可以对这一点有所了解吗?

继续这之后,由于它没有实现,为什么不删除它?我知道Java向后兼容性的全部内容,但由于没有代码可以调用此方法并且在运行时工作,当然这不是代码破坏性的变化吗?或者它之前可以编译的事实是否现在无法计算(即使它无法编译成任何有意义的东西?)

2 个答案:

答案 0 :(得分:2)

Thread.destroy()的文档链接到reasons for deprecation的Thread方法。奇怪的是,链接声明:

  

我们目前没有实施,但我们也不是   弃用它

即使方法明确注释为已弃用。就好像它们将它包含在API中一样,所以人们可以调用它并期望设计的功能在以后工作,然后想得更好,所以他们包括说“没有实现,但没有弃用“,然后继续并弃用它,忘了更新文档。

Oracle确实需要bug reports,这可能符合他们可用于增强文档的反馈。

答案 1 :(得分:1)

您是否阅读了the docs

  

此方法最初设计用于在没有任何内容的情况下销毁此线程   清理。它持有的任何监视器都将保持锁定状态。然而   方法从未实施过。如果要实施,它会   以suspend()的方式很容易出现死锁。如果是目标   线程持有一个锁,保护关键系统资源   销毁,没有线程可以再次访问此资源。如果另一个   线程曾试图锁定此资源,否则会导致死锁。   这种死锁通常表现为“冻结”过程。   有关更多信息,请参阅为什么是Thread.stop,Thread.suspend和   Thread.resume已弃用?。

此外,来自"Java Thread Primitive Deprecation"(从上面链接):

  

Thread.destroy从未实现过。如果它被实施,它   会以Thread.suspend的方式出现死锁。 (事实上​​,它   大致相当于Thread.suspend而没有a的可能性   后续的Thread.resume。)我们目前没有实现它,   但我们也没有弃用它(阻止它的实施   未来)。虽然它肯定会出现死锁,但它一直存在   认为可能存在程序愿意的情况   冒险陷入僵局而不是彻底退出。