4

我试图找出当我的对象被取消时关闭与服务的连接的最佳方法。

我有这样的事情:

class something {
  public final LongConnection lc;
  public something ()  {
    lc = new LongConnection ();
    lc.initConnection ();
    new Thread (new Runnable () { 
      public void run () { 
        ReferenceQueue<LongConnection> rq = new ReferenceQueue<LongConnection> ();
        WeakReference<LongConnection> wr = new WeakReference<LongConnection> (lc, rq);

        // now it should start listening for the object to be added to the queue
        while (true) {
          Reference<? extends LongConnection> ref = rq.remove ();
          if (rq != null) { 
            rq.get ().shutdown ();
            break;
          }
        }
        // will fall through and die! 
      }
    }).start ()
  }

这样我可以实例化这样的东西:

somefunction () { 
  something = new something ()
}

并且当方法返回(并且被取消范围/gc'd)时,它将正确关闭连接。

问题:(1)这真的很糟糕吗?!?!(2) 它会起作用吗(测试……正在进行中……)?(3)什么是关闭某物的“正确”方式?如果可以避免的话,我不想将关机的问题推广到程序的下一层。

4

2 回答 2

5

是的:在 Java 中,将任何资源的管理与内存管理相结合是一种不当行为。除了内存管理之外的所有事情都必须明确地完成。Java 7 引入了一个有用的新结构,称为“自动资源管理”,它有助于处理所涉及的样板。

具体来说,您无法保证:

  1. JVM何时会意识到对象是弱可达的;
  2. 何时清除弱引用;
  3. 当 JVM 将通过将其排入您的参考队列来通知您该事实时。
于 2012-11-06T10:36:40.277 回答
1

ResultSet稀有资源(如 SQL 、或文件句柄Statement)的垃圾收集不会关闭该资源。您应该在获取它的方法范围内的 finally 块中执行此操作。Connection

于 2012-11-06T10:38:44.710 回答