Java 9 Cleaner 的正确用法
Java 9 Cleaner Correct Usage
阅读有关 Java 9 的 Cleaner class,我在同一页中找到了这个示例:
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();
}
}
第二行有一条评论说:
A cleaner, preferably one shared within a library
为什么最好在图书馆内共享一个 Cleaner
(静态)?
有没有人有关于如何使用 Cleaner
而不是覆盖 finalize()
的好例子?
文档明确提到:
The choice of a new cleaner or sharing an existing cleaner is determined by the use case.
还有:
Each cleaner operates independently, managing the pending [...]
这意味着在一个应用程序中允许多个 Cleaner
实例。
同样,由于提供了工厂方法 Cleaner::create
并记录为
Returns a new Cleaner.
我不明白为什么每个应用程序只应使用一个 Cleaner
,尽管评论明确指出不是这样。
通过在网上冲浪一分钟,我找到了几个示例(例如 this article),每个示例都使用了 static
Cleaner AutoCloseable
sub-class。
private final static Cleaner cleaner = Cleaner.create();
Why is it preferable to have one shared Cleaner (static) within a library?
清洁工有一个关联的线程。线程是有限的本机资源。因此,我们的目标是通过不创建不必要的清洁器来限制创建的线程数量。
Does anybody have a good example about how to use Cleaner instead of overriding finalize()?
您发布了参考示例。如果这还不够,您需要提出更具体的问题。
如果使用java9希望对您有所帮助。
下面的代码已经在 Intellij IDEA 2017 和 oracle 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();
}
}
}
阅读有关 Java 9 的 Cleaner class,我在同一页中找到了这个示例:
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();
}
}
第二行有一条评论说:
A cleaner, preferably one shared within a library
为什么最好在图书馆内共享一个 Cleaner
(静态)?
有没有人有关于如何使用 Cleaner
而不是覆盖 finalize()
的好例子?
文档明确提到:
The choice of a new cleaner or sharing an existing cleaner is determined by the use case.
还有:
Each cleaner operates independently, managing the pending [...]
这意味着在一个应用程序中允许多个 Cleaner
实例。
同样,由于提供了工厂方法 Cleaner::create
并记录为
Returns a new Cleaner.
我不明白为什么每个应用程序只应使用一个 Cleaner
,尽管评论明确指出不是这样。
通过在网上冲浪一分钟,我找到了几个示例(例如 this article),每个示例都使用了 static
Cleaner AutoCloseable
sub-class。
private final static Cleaner cleaner = Cleaner.create();
Why is it preferable to have one shared Cleaner (static) within a library?
清洁工有一个关联的线程。线程是有限的本机资源。因此,我们的目标是通过不创建不必要的清洁器来限制创建的线程数量。
Does anybody have a good example about how to use Cleaner instead of overriding finalize()?
您发布了参考示例。如果这还不够,您需要提出更具体的问题。
如果使用java9希望对您有所帮助。
下面的代码已经在 Intellij IDEA 2017 和 oracle 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();
}
}
}