📜  Java的.lang.ref.ReferenceQueue类在Java中

📅  最后修改于: 2022-05-13 01:55:37.793000             🧑  作者: Mango

Java的.lang.ref.ReferenceQueue类在Java中

ReferenceQueue 是一个简单的数据结构,当引用字段被清除(设置为 null)时,垃圾收集器将引用对象放置在该结构上。您将使用引用队列来确定对象何时变得软可到达、弱可到达或幻象可到达,以便您的程序可以根据该知识采取一些行动。例如,程序可能会执行一些需要对象不可访问的后终结清理处理(例如在Java堆外重新分配资源),当得知某个对象已变为幻影可达时。

Java 中的 java.lang.ref.ReferenceQueue 类

ReferenceQueue 可用于确定对象是否弱、软或幻影不可访问。现在深入挖掘,让我们定义在此类中调用的构造函数,如下所示:

public ReferenceQueue():它构造一个新的引用对象队列。

此外,让我们在 ReferenceQueue 类中定义方法



Method NameMethod 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