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() каждые пять секунд.

Это не так уж плохо, если некоторые ресурсы не будут уничтожены в конце (например, статические), потому что я удаляю контекст в конце (который также уничтожает другие ресурсы).

Это хорошая идея или есть лучший способ сделать это?

0 ответов

Другие вопросы по тегам