In the main thread. Otherwise, you'll end up rendering inbetween states. You can run in another thread, if you synchronize it with the rendering properly, but I don't think that it's worth the trouble. animate() itself isn't that slow unless you are animating really large objects.
Anyway, animate() works on VM data structures only. It doesn't do any direct calls to GL, so I don't see why putting it in another thread should cause such issues.