考虑一个使用 PhantomReferences 来避免终结器的库,同时确保释放一些 JNI 资源。
一种架构涉及引用队列和阻塞在引用队列上执行清理操作的线程。
现在的问题是:如何对这一切进行测试?
- 设置系统
- 创建感兴趣的对象
- 让它成为垃圾
- 系统.gc()
- 以某种方式等待线程醒来,闻到咖啡的味道,然后完成工作
- 断言内部计数器已被勾选以证明所有这一切都发生了
Thread.sleep()
有效,但对于第 5 项来说令人不安。Thread.yield()
根本不可靠。还有哪些其他选择(如果有)?
最佳答案
如果您可以对相关库进行更改,请传递可选的 BlockingQueue<Reference?>>
进入清理代码,以便它可以发出完成信号。如果队列存在,则清理代码在执行清理后将对队列的引用加入队列。测试代码可以调用BlockingQueue.poll(timeout)
-- 清理完成后立即接收引用,或者如果清理未在您确定的合理上限超时时间内完成,则超时。
关于java - 为 PhantomReference 应用程序创建可重复的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532957/