Все методы в ApplicationListener вызываются в одном и том же потоке. Этот поток является потоком визуализации, в котором делаются OpenGL вызовы. Для
большинства игр этого достаточно, чтобы реализовать обновление логики и визуализации в render() методе ApplicationListener интерфейса и в потоке
визуализации.
Любые операции связанные с графикой и прямым участием OpenGL, должны быть выполнены в потоке визуализации. Делая это в другом потоке, вы можете вызвать не предсказуемое поведение приложения. Это связано с тем, что контекст OpenGL находится в активном состоянии только в потоке визуализации. Смена текущего контекста в других потоках имеет проблемы на множестве Android устройств, поэтому визуализации в другом потоке не поддерживается.
Для передачи данных в поток визуализации из другого потока рекомендуется использовать
postRunnable() метод из Application. Этим самым
выполнение кода будет в Runnable и в потоке визуализации при следующем кадре, но перед вызовом render() метода ApplicationListener интерфейса.
new Thread(new Runnable() {
@Override
public void run() {
// выполнение чего-либо важного асинхронно потока визуализации
final Result result = createResult();
// передача Runnable в поток визуализации, который обработает результат
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
// обработка результата, например добавление в Array<Result> поле ApplicationListener.
results.add(result);
}
});
}
}).start();
HTML5
По своей сути Javascript является однопоточным. Таким образом, многопоточность не возможна. В будущем, одним из вариантов может быть Web Workers, однако данные между потоками передаются через сообщения. Java использует другие примитивы и механизмы, поэтому перенос кода для Web Workers будет не столь прямым.