Java 9 Cleaner 正确用法

2022-09-03 07:49:06

阅读有关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

有没有人有一个很好的例子来说明如何使用而不是覆盖?Cleanerfinalize()


答案 1

为什么最好在库中有一个共享的清理器(静态)?

清理程序具有关联的线程。线程是有限的本机资源。因此,目标是通过不创建不必要的清理程序来限制创建的线程数量。

有没有人有一个很好的例子来说明如何使用Cleaner而不是覆盖finize()?

您发布了参考示例。如果这还不够,您需要提出更具体的问题。


答案 2

文档确实明确提到:

选择新的清洁程序或共享现有的清洁程序取决于用例。

也:

每个清洁工独立运行,管理待处理的[...]

这意味着一个应用程序中允许使用多个实例。Cleaner

同样,由于提供了工厂方法,并且记录为Cleaner::create

返回新的清洁剂。

我不明白为什么每个应用程序只应使用一个,尽管注释肯定另有说明。Cleaner


通过浏览网页一分钟,我发现了一些例子(例如本文),并且每个子类都使用清洁器。staticAutoCloseable

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