تفاوت این دو مفهوم برای خیلی مشخص نیست، با آنکه به کلی متفاوت از هم می باشند.
مفهوم Asynchronous به ماهیت Non-Blocking یک متد یا فرایند اشاره می کند. به طور ساده، می دانیم که در صورت صدا زدن یک متد، جریان برنامه متوقف می شود. پس از پایان یافتن متد، برنامه مجددا به مسیرِ اجرای خود ادامه خواهد داد. به این نوع از متد ها متدهای Blocking گفته می شود، بدین معنی که فرایند برنامه تا زمانِ اتمام این نوع از متد ها متوقف (بلاک) خواهد شد. اما در موردمتدهای Non-Blocking و یا Asynchronous قضیه فرق می کند و جریانِ اصلی برنامه پس از صدا زدن متد، معطل تمام شدن متد نخواهد ماند و به مسیر خود ادامه خواهد داد. این نوع از متدها معمولا در مورد امور I/O و مواردی که در حوزه سیستم عامل، دیسک و شبکه و پایگاه داده و ... می باشند، مورد استفاده قرار می گیرند.
از سوی دیگر مفهوم Multi Threading به این موضوع اشاره می کند که یک تکه از کد همزمان توسط چند Thread در حال اجرا می باشد. این نوع از اجرا بیشتر در مورد کد هایی استفاده می شوند که به اصطلاح CPU Bound بوده و دارای بار پردازشی زیادی می باشند. با تقسیم بار بین چند پردازنده سعی می کنیم، موجب سریع تر و بهینه تر شدن کد شویم.
http://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/