Java之Cleaner


介紹:

Cleaner是JDk1.9之后提供的一個對象清理操作,主要的功能是進行finialize()方法的替代。

輸入Java因為自身JVM的特性不用用戶自己去回收垃圾,但是仍然存在此類操作。

public class Member { public Member(){ System.out.println("誕生!"); } @Override protected void finalize() throws Throwable{//從JDk1.9開始不建議使用
    System.out.println("回收:必死"); 
    throw new Exception("不想死"); }
  }

 

public class Main { public static void main(String[] args) { Member mm = new Member();   // 誕生
        mm = null;  // 成為垃圾
 System.gc(); System.out.println("死亡並不結束!"); } }

 

 從JDk1.9開始不建議使用finialize()方法,從而建議使用AutoCloseable或者Cleaner進行處理。

新版本的清除操作:

public class Member implements Runnable{ public Member(){ System.out.println("【構造】Born"); } @Override public void run() {     // 執行清除的時候,執行的是此操作
        System.out.println("【回收】Death"); } }

 

import java.lang.ref.Cleaner; public class MemberCleaning implements AutoCloseable{    // 實現清除
    private static final Cleaner cleaner = Cleaner.create();    // 創建清除處理
    private Member member; private Cleaner.Cleanable cleanable; public MemberCleaning() { this.member = new Member(); this.cleanable = this.cleaner.register(this,this.member);    // 注冊使用的對象
 } @Override public void close() throws Exception { this.cleanable.clean(); // 啟動多線程
 } }

 

public class Main { public static void main(String[] args) throws Exception{ try (MemberCleaning mc = new MemberCleaning()){ // 中間可以執行一些相關的代碼
        }catch (Exception e){ } } }

 

 新一代的清除回收操作,考慮的是多線程的使用:

  為了防止可能造成的多線程的延遲處理,許多對象回收前的處理都是單獨通過一個線程完成的,這樣能夠保證執行性能的提高。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM