Java 9 Cleaner 正确用法

问题描述 投票:0回答:4

阅读 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()
的好例子吗?

java garbage-collection resources
4个回答
10
投票

为什么最好在库中拥有一个共享 Cleaner(静态)?

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

有人有关于如何使用 Cleaner 而不是重写 Finalize() 的好例子吗?

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


2
投票

文档明确提到:

选择新的清洁器还是共享现有的清洁器取决于用例。

还有:

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

这意味着应用程序中允许有多个

Cleaner
实例。

同样,由于提供了工厂方法

Cleaner::create
并记录为

退回新的清洁剂。

我不明白为什么每个应用程序只应使用一个

Cleaner
,尽管评论明确指出了相反的情况。


通过上网冲浪一分钟,我找到了一些示例(例如这篇文章),并且每个

static
子类都使用了
AutoCloseable
清洁器。

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

0
投票

很晚回复,但希望这可以帮助那些努力理解 Java Cleaners 的人,你的问题的第一部分是正确的


-4
投票

希望对使用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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.