Я использую libgdx для игры, которую я пишу, где у меня есть другой поток, который должен обновить графический поток. Я получал сбои, поскольку libgdx не был потокобезопасным (намеренно), и я разрешал другому потоку напрямую изменять переменную в графическом потоке.Можно ли использовать Runnable содержащие затворы
libgdx docs предлагает что-то похожее на следующий код. Это в основном закрытие, содержащее входящую информацию, которая затем обрабатывается, когда графический поток попадает на нее.
Я изменил его, чтобы объявить runnable вне слушателя в надежде, что я смогу избежать сбора мусора, но мне приходит в голову, что я, возможно, создал условие гонки теперь, когда runnable может быть перезаписан до графическая нить, потребляющая предыдущую информацию?
До сих пор мне удалось избежать сбора мусора повсюду, и моя игра также использует привязки аудио с низкой задержкой в Android, поэтому сбор мусора - это действительно мой враг.
Любые предложения?
private Runnable runnable;
private SomeListener listener = new SomeListener() {
@Override
public void messageIn(final String source, final String s, final Object... l) {
runnable = new Runnable() {
@Override
public void run() { getWorkspace().messageIn(s,l); }
};
Gdx.app.postRunnable(runnable);
}
};
Мои сообщения крошечные (ключевое слово и поплавок или два), так что это может быть хорошим вариантом. Я предполагаю, что стоимость синхронизации памяти пропорциональна размеру сообщений? И .. ох .. как я могу заставить свои закрытия работать, если я не в новом Runnable? –
Стоимость синхронизации, вероятно, является линейной стоимостью - не учитывается размер сообщения @DarenSchwenke. Куда к закрытию приходят? Это анонимный класс, но я не вижу никаких закрытий. – Gray
с использованием s и l из messageIn в пределах runnable run call через getWorkspace(). MessageIn (s, l); Наверное, это путают. Внешнее messageIn - это метод в моем другом потоке, внутренний - метод в графическом потоке. Сделать их окончательными во внешности по существу создает замыкание при использовании в объявлении нового права Runnable ... или я ошибаюсь. (perl guy, который начал java около 6 месяцев назад) –