Многопоточность нужна, чтобы мы могли параллельно решать несколько задач внутри приложения. Например, показывать анимацию солнышка, запрашивать данные о температуре с сервера и проигрывать звуки птиц.
Но начнём с основ. Существуют два очень похожих понятия: процессы и потоки. И многие их путают в самом начале изучения, включая меня. Но на самом деле всё просто. Процесс → отдельное приложение. Если запущено 2 приложения, то это два разных процесса. Три приложения →
3 процесса. У каждого приложения свой процесс и у них нет доступа к соседнему процессу. Т.е. у каждого процесса какая-то своя область памяти, с которой он работает.
Потоки → это уже внутри приложения (процесса). Т.е. анимация солнышка и звуки птиц → это как раз потоки, которые происходят внутри одного процесса (приложения). Один поток отвечает за солнышко, второй за звуки, третий за запрос данных с сервера. И потоки могут обмениваться данными с другими потоками внутри приложения.
Главное запомнить: 1 процесс → 1 приложение, 1 приложение → много потоков.
Минутка истории: когда-то давно существовали компьютеры только с одним процессором. И вот они в единицу времени выполняли одну задачу. Если мы одновременно запускали Paint и Winamp (ох, уж эта ностальгия), то казалось, что мы одновременно рисуем и слушаем музыку. Ничего же не прерывалось. Но на самом деле всё выполнялось последовательно, просто очень-очень быстро. Так быстро, что мы даже не улавливали это. Процессор постоянно переключался между музыкой и кисточкой в Paint. Но вот если параллельно запустится мощный антивирус, то всё зависнет. Как же я ненавидела те моменты. Просто в этот момент процессор отдавал время антивирусу, поэтому Winamp и Paint стояли в очереди.
С двумя ядрами стало легче, ведь можно было делать две параллельные задачи. Теперь антивирусу можно было отдать одно ядро, а на втором рисовать и слушать музыку. Так не зависает.
С многоядерностью вообще легче. Во многих учебниках все показывают пример с картинкой: есть изображение и надо пройтись по каждому пикселю и обесцветить его. Предположим, что это займёт минуту на 1 ядре. Т.е. просто последовательно проверяем каждый пиксель.
А теперь возьмём компьютер с 4 ядрами. Расчет каждого пикселя не зависит от другого. Значит эту задачу можно поделить на все ядра. Но стоит учесть, что сначала пара секунд уйдёт на раздел картинки (кто какой частью занимается) и пара секунд в конце на слияние картинки обратно в единое целое. Но зато теперь обесцветить всю картинку можно будет за 15 секунд + 4 = 19 секунд. Значительная разница: 19 секунд против минуты. А представьте, что таких картинок много.
Обратите внимание, что четырехкратной скорости нет, потому что уходит время на подготовку и т.п.
Кстати, в играх аналогично задачи делятся на сегменты. И чем больше ядер, чем меньше тормозов: 1 ядро может заняться графикой, второе подгрузкой данных, третье ещё чем-нибудь. Красота. :)