Java的.lang.ref.ReferenceQueue类在Java中
ReferenceQueue 是一个简单的数据结构,当引用字段被清除(设置为 null)时,垃圾收集器将引用对象放置在该结构上。您将使用引用队列来确定对象何时变得软可到达、弱可到达或幻象可到达,以便您的程序可以根据该知识采取一些行动。例如,程序可能会执行一些需要对象不可访问的后终结清理处理(例如在Java堆外重新分配资源),当得知某个对象已变为幻影可达时。
ReferenceQueue 可用于确定对象是否弱、软或幻影不可访问。现在深入挖掘,让我们定义在此类中调用的构造函数,如下所示:
public ReferenceQueue():它构造一个新的引用对象队列。
此外,让我们在 ReferenceQueue 类中定义方法
Method Name | Method Description |
---|---|
poll() | Polls this queue to see if a reference object is available. If one is available without further delay then it is removed from the queue and returned. Otherwise, this method immediately returns null. |
remove() | Removes the next reference object in this queue, blocking until one becomes available. |
remove(long TimeOut) | Removes the next reference object in this queue, blocking until either one becomes available or the given timeout period expires. |
下面分别对上述方法进行详细讨论:
方法一: Queue接口的poll()方法返回并移除容器最前面的元素。它删除容器中的元素。当 Queue 为空时,该方法不会抛出异常,而是返回 null。
句法:
E poll()
返回:该方法返回容器前端或队列头部的元素。当 Queue 为空时,它返回 null。
方法二: Queue接口的remove()方法返回并移除容器最前面的元素。它删除容器的头部。当队列为空时,该方法会引发称为 NoSuchElementException 的异常。
句法:
E remove()
返回:此方法返回队列的头部。
异常:当队列为空时,该函数抛出NoSuchElementException 。
到目前为止,我们已经完成了对本课程中主要方法的讨论。让我们直接进入这个类中这些方法的实现。
例子:
Java
// Java Program to illustrate ReferenceQueue Class
// Importing classes from package- java.lang.ref
// to make a deal between program with garbage collector
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
// Class 1
// Helper class
class HelperClass {
// Method of this class
void Display()
{
// Print statement whenever
// function of HelperClass is called
System.out.println(
"HelperClass Display() invoked...");
}
}
// Class 2
// Main class
class GFG {
// Main drive method
public static void main(String[] args)
{
// Creating new object of HelperClass
HelperClass obj = new HelperClass();
// Creating Reference queue of HelperClass
ReferenceQueue rq
= new ReferenceQueue<>();
// Creating Phantom reference
WeakReference wr
= new WeakReference<>(obj);
// Display message
System.out.println("-> Reference Queue Object :");
// Printing reference queue object
System.out.println(rq);
// Display message
System.out.println("-> Reference Queue Poll :");
// Checking if phantom object is lined up
// or cleared in the queue
// using the poll() method
System.out.println(rq.poll());
}
}
-> Reference Queue Object :
java.lang.ref.ReferenceQueue@214c265e
-> Reference Queue Poll :
null