Многопоточность vs асинхронность?
Различия в подходах работы соответствующих методов, чья работа должна выполняться долго и чего то ждать (например сетевое взаимодействие но не обязательно само собой).

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

Асинхронное выполнение - это значит вызов начала действия завершается в тот же миг как был вызван, запуская процесс загрузки каким-либо способом (зачастую в другом потоке но не обязательно) и дает вам какие то инструменты получения информации о том, завершилась ли работа или нет, например callback методы, которые вызываются по завершению работы или ошибки, в параметрах которых будет выдан результат (либо для его получения будут другие методы). Т.е. вы можете запустить несколько асинхронных действий одновременно, эффективно расходуя ресурсы.

Многопоточное - в разрезе выше описанной задачи, это подход запуска одновременно нескольких синхронных методов, которые готовы к такому запуску (эта оговорка требует примечаний километра на два текста) в отдельных потоках (треды и/или процессы) - специальных сущностях операционной системы, работающих независимо и одновременно (точнее псевдоодновременно, к примеру у вас 16 ядер процессора а у вас 100 одновременно работающих потоков, чтобы они работали одновременно система сама периодически перекидывает активные потоки между ядрами на короткое время - миллисекунды, замораживая остальные, создавая иллюзию одновременной работы), таким образом ваши методы работают одновременно, но приходится тратить силы на синхронизацию.
Различия в подходах работы соответствующих методов, чья работа должна выполняться долго и чего то ждать (например сетевое взаимодействие но не обязательно само собой).

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

Асинхронное выполнение - это значит вызов начала действия завершается в тот же миг как был вызван, запуская процесс загрузки каким-либо способом (зачастую в другом потоке но не обязательно) и дает вам какие то инструменты получения информации о том, завершилась ли работа или нет, например callback методы, которые вызываются по завершению работы или ошибки, в параметрах которых будет выдан результат (либо для его получения будут другие методы). Т.е. вы можете запустить несколько асинхронных действий одновременно, эффективно расходуя ресурсы.

Многопоточное - в разрезе выше описанной задачи, это подход запуска одновременно нескольких синхронных методов, которые готовы к такому запуску (эта оговорка требует примечаний километра на два текста) в отдельных потоках (треды и/или процессы) - специальных сущностях операционной системы, работающих независимо и одновременно (точнее псевдоодновременно, к примеру у вас 16 ядер процессора а у вас 100 одновременно работающих потоков, чтобы они работали одновременно система сама периодически перекидывает активные потоки между ядрами на короткое время - миллисекунды, замораживая остальные, создавая иллюзию одновременной работы), таким образом ваши методы работают одновременно, но приходится тратить силы на синхронизацию.