Использование Executor позаботится о запутанных деталях синхронизации потоков, поэтому это должен быть самый простой способ одновременного выполнения нескольких задач. Вы просто отправляете задания исполнителю и ждете их завершения.
Если эти фоновые задачи обращаются к какому-либо общему ресурсу (особенно структурам данных в памяти), то этот доступ должен быть скоординирован. Самый простой способ - избежать общих ресурсов, но если вы сможете это сделать, это зависит от того, что вам действительно нужно делать. Если у вас должны быть общие ресурсы, вы можете использовать примитивы синхронизации Java или некоторые другие утилиты из пакета параллелизма.
Вы не можете иметь несколько потоков и не думать о синхронизации.
Здесь нет серебряной пули.
(Кстати, даже без нескольких потоков для одного веб-запроса, вам, вероятно, все равно придется учитывать проблемы с многопоточностью в веб-приложении, поскольку один и тот же веб-сервер может одновременно работать с несколькими запросами).