用于关闭连接的Java弱引用
当我的对象被描述时,我正试图找出关闭服务连接的最佳方法 我有这样的想法:用于关闭连接的Java弱引用,java,weak-references,Java,Weak References,当我的对象被描述时,我正试图找出关闭服务连接的最佳方法 我有这样的想法: class something { public final LongConnection lc; public something () { lc = new LongConnection (); lc.initConnection (); new Thread (new Runnable () { public void run () { Referen
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 ()
}
当该方法返回(并且是descoped/gc'd)时,它将正确地关闭连接
问题:
(1) 这真的很糟糕吗?!?!
(2) 它会工作吗(测试正在进行中)?
(3) 关闭某些东西的“正确”方式是什么?如果可以避免的话,我不想将关机问题提升到程序的下一层。是的:在Java中,将任何资源的管理与内存管理结合起来是一种不切实际的做法。除了内存管理之外,其他一切都必须明确地完成。Java7引入了一个名为“自动资源管理”的有用的新构造,它有助于处理所涉及的样板文件 具体而言,您没有得到以下方面的任何保证:
稀缺资源的垃圾收集,如SQL
ResultSet
、语句
、连接
或文件句柄,不会关闭资源。您应该在获取它的方法范围内的finally块中执行此操作。确实如此-这意味着不要执行此操作?此连接的作用域不能仅限于函数或类。它实际上是一个由“something”类封装的共享资源。所以不要这样做?不管你有什么问题,使用弱引用并不能解决它,但会带来另一个问题。这就是我担心的:/你需要引入一种机制,在适当的时候显式调用它。