簡體   English   中英

Java 9 Cleaner正確用法

[英]Java 9 Cleaner Correct Usage

閱讀Java 9的Cleaner類,我在同一頁面中找到了這個例子:

public class CleaningExample implements AutoCloseable {
    // A cleaner, preferably one shared within a library
    private static final Cleaner cleaner = <cleaner>;

    static class State implements Runnable {

        State(...) {
            // initialize State needed for cleaning action
        }

        public void run() {
            // cleanup action accessing State, executed at most once
        }
    }

    private final State;
    private final Cleaner.Cleanable cleanable

    public CleaningExample() {
        this.state = new State(...);
        this.cleanable = cleaner.register(this, state);
    }

    public void close() {
        cleanable.clean();
    }
}

在第二行有評論說:

清潔工,最好是在圖書館內共享的清潔工

為什么在庫中有一個共享Cleaner (靜態)更可取?

有沒有人有一個關於如何使用Cleaner而不是覆蓋finalize()的好例子?

為什么在庫中有一個共享清理程序(靜態)更可取?

清潔工有一個相關的線程。 線程是有限的本機資源。 因此,目標是通過不創建超過必要的清潔程序來限制創建的線程數量。

有沒有人有一個關於如何使用Cleaner而不是覆蓋finalize()的好例子?

您發布了參考示例。 如果不充分,您需要詢問更具體的問題。

文檔明確提到:

選擇新的清潔劑或共享現有的清潔劑由用例決定。

也:

每個清潔工獨立運作,管理待處理的[...]

這意味着應用程序中允許多個Cleaner實例。

同樣,由於提供了工廠方法Cleaner::create並將其記錄為

返回一個新的Cleaner。

我不明白為什么每個應用程序只應使用一個Cleaner ,盡管評論明確指出。


通過瀏覽網頁一分鍾我發現了一些例子(例如本文 ),並且每個AutoCloseable子類都使用static清理器。

private final static Cleaner cleaner = Cleaner.create();

希望它對你有幫助,如果使用java9。

下面的代碼已在Intellij IDEA 2017oracle jdk 9中測試過。

import java.lang.ref.Cleaner;

public class Main {

    public Main() {

    }

    public static void main(String[] args) {
        System.out.println("Hello World!");

        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Cleaner cleaner = Cleaner.create();
            Main obj = new Main();
            cleaner.register(obj, new Runnable() {
                @Override
                public void run() {
                    System.out.println("Hello World!222");
                }
            });
            System.gc();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM