Java использует finalize для добавления задачи очистки для другого потока
Я использую OpenGL в Java, и я должен удалить внешние ресурсы (например, vbos). Рекомендуемый способ - иметь Disposable
интерфейс. Однако для этого потребовалось бы, чтобы почти каждый класс, имеющий дело с ресурсами, реализовывал этот интерфейс. И я пробовал это, но мне часто не ясно, какой объект должен отвечать за вызов dispose()
метод. Вот почему я запрограммировал что-то вроде этого:
public abstract class Destroyable {
private static final ArrayList<Runnable> cleanupTasks = new ArrayList<Runnable>();
public static void cleanup() {
synchronized (cleanupTasks) {
for (Runnable cleanupTask : cleanupTasks) {
cleanupTask.run();
}
}
}
protected abstract void destroy();
@Override
protected void finalize() throws Throwable {
try {
synchronized (cleanupTasks) {
// Let's do cleanup in the main thread as the garbage collector runs in another thread
cleanupTasks.add(new Runnable() {
public void run() {
destroy();
}
});
}
} finally {
super.finalize();
}
}
}
Поскольку сборщик мусора не будет работать большую часть времени, я звоню Destroyable.cleanup()
вместе с System.gc()
каждые пять секунд.
Это не так уж плохо, если некоторые ресурсы не будут уничтожены в конце (например, статические), потому что я удаляю контекст в конце (который также уничтожает другие ресурсы).
Это хорошая идея или есть лучший способ сделать это?