使用finalize方法替代Timer?

时间:2017-02-10 06:25:22

标签: java multithreading performance timer garbage-collection

我正在编写一个REST客户端,它有一个具有固定过期时间的访问令牌。

如何确保在到期时间之前请求新令牌?我看到两个选择:

  1. Timer
  2. 使用finalize方法的一些恶作剧可能使用ref package
  3. 1)需要我创建一个在给定时间内运行并请求新令牌的新线程。这对我来说似乎很浪费。

    2)将利用将继续运行的GC线程,因此我不需要创建新线程。当finalize运行时,只检查令牌是否即将到期,如果是,则请求新的,如果没有再次使对象可用,直到下一个GC周期运行。

    评论或其他想法?

1 个答案:

答案 0 :(得分:1)

使用finalize

可能会产生问题
  • 调试地狱。您依赖于GC调用您的方法,您没有对该对象的适当引用等等。
  • 未正确清理的可能性增加,因为您使用finalize()创建资源并打开新连接,而不是关闭和清理它们。
  • 可能永远不会调用GC ,永远不会续订令牌。
  • 获取新令牌时可能会发生异常,因此现在您在GC线程中抛出意外异常 - 不想要。
  • 获取新令牌成功,但由于某种原因(例如网络速度慢)需要很长时间,因此您可能会获得java.lang.OutOfMemoryError: GC overhead limit exceeded

创建新主题是relatively inexpensive。当然,有更好的方法,但我们在这里谈论微秒。你说创建一个新线程“看起来很浪费”,但是,只要考虑它的替代方案,you already wasted more time than the overhead caused by creating a new thread every second for the next 40 years

使用计时器。

编辑:或者,更好的是,使用ScheduledExecutorService(参见评论)。