Java: внедрение непустыJAVA

Программисты JAVA общаются здесь
Anonymous
Java: внедрение непусты

Сообщение Anonymous »

Я внедряю класс обертки JNI, который очищает нативные ручки. Нам нужно поддерживать Java 8-17, поэтому мы используем как завершение (для Java 8), так и чище (для Java 9+). Я собираюсь загрузить более чистый с помощью отражения и отступления на метод завершения, когда будет выполнена только один, так что будет выполнено только один. Тем не менее, я вижу неожиданное поведение при реализации этого и того же класса. Но если infintize () содержит какой -либо код (даже просто System.out.println), чистящее средство никогда не работает. Почему это происходит? < /P>
Вот минимальный пример. Если Println комментируется, он проходит. Если нет, это не удалось < /p>
public abstract class Cleanable {
private static final Cleaner cleaner = Cleaner.create();
private final Cleaner.Cleanable cleanable;
private Runnable cleanAction;

public Cleanable(Runnable inputCleanAction) {
cleanable = cleaner.register(this, inputCleanAction);
this.cleanAction = inputCleanAction;
}

@Override
public void finalize() throws Throwable {
\\ System.out.println("finalize called");
}
}
< /code>
AtomicInteger cleaned = new AtomicInteger(0);
{
Cleanable cleanable = new Cleanable(() -> cleaned.incrementAndGet()) {};
cleanable = null;
}
System.gc();
Thread.sleep(1000);

Assert.assertEquals(1, cleaned.get());
< /code>
Holding the reference to the cleanAction as an instance variable is not the problem because this code works as long as the finalize body is empty. As soon as I do anything inside of finalize, it fails.

Подробнее здесь: https://stackoverflow.com/questions/794 ... -never-run

Вернуться в «JAVA»