Для ArrayList remove(0) - самая медленная операция, она требует смещения всего массива.
Используйте ArrayDeque, например.