- Java并發(fā)編程之美
- 翟陸續(xù) 薛賓田
- 14字
- 2019-07-25 11:54:02
第2章 并發(fā)編程的其他基礎(chǔ)知識(shí)
2.1 什么是多線程并發(fā)編程
首先要澄清并發(fā)和并行的概念,并發(fā)是指同一個(gè)時(shí)間段內(nèi)多個(gè)任務(wù)同時(shí)都在執(zhí)行,并且都沒有執(zhí)行結(jié)束,而并行是說在單位時(shí)間內(nèi)多個(gè)任務(wù)同時(shí)在執(zhí)行。并發(fā)任務(wù)強(qiáng)調(diào)在一個(gè)時(shí)間段內(nèi)同時(shí)執(zhí)行,而一個(gè)時(shí)間段由多個(gè)單位時(shí)間累積而成,所以說并發(fā)的多個(gè)任務(wù)在單位時(shí)間內(nèi)不一定同時(shí)在執(zhí)行。在單CPU的時(shí)代多個(gè)任務(wù)都是并發(fā)執(zhí)行的,這是因?yàn)閱蝹€(gè)CPU同時(shí)只能執(zhí)行一個(gè)任務(wù)。在單CPU時(shí)代多任務(wù)是共享一個(gè)CPU的,當(dāng)一個(gè)任務(wù)占用CPU運(yùn)行時(shí),其他任務(wù)就會(huì)被掛起,當(dāng)占用CPU的任務(wù)時(shí)間片用完后,會(huì)把CPU讓給其他任務(wù)來使用,所以在單CPU時(shí)代多線程編程是沒有太大意義的,并且線程間頻繁的上下文切換還會(huì)帶來額外開銷。
圖2-1所示為在單個(gè)CPU上運(yùn)行兩個(gè)線程,線程A和線程B是輪流使用CPU進(jìn)行任務(wù)處理的,也就是在某個(gè)時(shí)間內(nèi)單個(gè)CPU只執(zhí)行一個(gè)線程上面的任務(wù)。當(dāng)線程A的時(shí)間片用完后會(huì)進(jìn)行線程上下文切換,也就是保存當(dāng)前線程A的執(zhí)行上下文,然后切換到線程B來占用CPU運(yùn)行任務(wù)。

圖2-1
圖2-2所示為雙CPU配置,線程A和線程B各自在自己的CPU上執(zhí)行任務(wù),實(shí)現(xiàn)了真正的并行運(yùn)行。

圖2-2
而在多線程編程實(shí)踐中,線程的個(gè)數(shù)往往多于CPU的個(gè)數(shù),所以一般都稱多線程并發(fā)編程而不是多線程并行編程。
- 移動(dòng)UI設(shè)計(jì)(微課版)
- 軟件測試項(xiàng)目實(shí)戰(zhàn)之性能測試篇
- Cassandra Design Patterns(Second Edition)
- Visual Basic程序設(shè)計(jì)教程
- C語言程序設(shè)計(jì)
- Unreal Engine 4 Shaders and Effects Cookbook
- Bootstrap 4 Cookbook
- Python深度學(xué)習(xí):模型、方法與實(shí)現(xiàn)
- Android驅(qū)動(dòng)開發(fā)權(quán)威指南
- Essential C++(中文版)
- JavaScript程序設(shè)計(jì):基礎(chǔ)·PHP·XML
- Orchestrating Docker
- Visual C++程序設(shè)計(jì)與項(xiàng)目實(shí)踐
- AI輔助編程Python實(shí)戰(zhàn):基于GitHub Copilot和ChatGPT
- Natural Language Processing with Python Cookbook