Никогда не понимал чем многопоточность отличается от асинхронности
Погугли, есть несколько хороших статей на первой странице гугла.
Основная мысль - асинхронность позволяет выполнять задачи вне привязки друг к другу, при этом не важно - на одном потоке или нет (например js или dart - однопоточные языки, но позволяют выполнять асинхронный код). Например - пока делается запись в локальную БД можно пушнуть данные на веб сервер, задачи независимые и никак не влияют друг на друга, можно их запустить одновременно
Многопоточность позволяет распараллелить выполнение задач между логическими потоками и в идеале дают повышенную производительность на многоядерных процах, например запросить данные с локальной БД и с сервера на двух потоках и как только придут оба результата - сравнить данные и обновить те, которые неактуальны. Тут два процесса будут выполняться параллельно на разных потоках не блокируя друг друга и результат придет соответственно быстрее (опять же, если позволяет проц)