ReferenceQueue

http://kenwublog.com/arrange-java-reference-concept

ReferenceQueue,一种当 weak, soft, phantom的referent被GC回收后,提供事件回调的接口。需要在实例化三大reference时,通过构造函数传入,phantom reference是强制需要传入的,weak和soft可不传。

回调过程:

GC回收referent后(phantom是在回收前,finalize后),将reference enqueue到RQ中,程序通过调用RQ的remove方法来感知reference被GC回收的事件。
remove方法是阻塞的,当没有referent被回收时(GC未调用enqueue),remove方法会一直挂起线程,当有referent被回收时,该方法返回 referent对应的reference对象。
同样,RQ也提供了一个非阻塞的方法 poll,但这样就做不到实时回调了。

实例

package com.kenwublog.reference;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.HashMap;

public class ReferenceQueueTest {

	public static void main(String[] args) {
		final ReferenceQueue q = new ReferenceQueue();
		String str = new String("AK47");
		WeakReference wr = new WeakReference(str, q);

		Thread t = new Thread(){
			@Override
			public void run() {
				try {
					Reference reference = q.remove();
					System.out.println(reference + " event fired.");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		t.setDaemon(true);
		t.start();
		System.out.println("Reference Queue is listening.");

		str = null; // clear strong reference
		System.out.println("Ready to gc");
		System.gc();
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("wr.get: " + wr.get());
	}

}

参考资料

http://mindprod.com/jgloss/phantom.html (References的目的,在GC的哪种阶段触发对比表格)
http://www.pawlan.com/monica/articles/refobjs/

http://java.sun.com/javase/6/docs/api/


你可能感兴趣的:(java,ee)