多线程编程的初步形象化理解
近日在學習Java的并發編程,接觸到一些新的概念,開始比較晦澀,就想到用一個例子來生動地解釋一下,或許可以幫助到初學者來理解。
?
并發編程,與順序編程相反相成。并發指的是,有多個程序同時處于開始執行和執行完畢的狀態之間。線程,是分配CPU時間的最小單位,用以驅動程序塊的執行。進程,是運行在它自己的地址空間內的自包容的程序。
說人話,用比喻來理解這個問題:
我們用馬來代指線程,用馬廄來代指線程池,用牧馬人來代指CPU。
作為一匹馬,可以執行拉車、拉磨、耕地、載人等各種任務,但是必須要有人來指揮管理才能正常執行。人可以給同一匹馬分配多個任務,也可以分配單個甚至不分配任務:相當于每一個線程都有自己的任務Runnable序列。每一匹馬會將車從頭拉到尾、或者把一擔谷子在磨盤上磨完再執行下一個任務:線程總是把一個任務隊列中的一個任務完成,才執行下一個任務。人需要照顧管理所有正在執行任務的馬,只有人在場,馬才能正常工作,否則它們都會偷懶,除非有多個牧馬人來管理——每一個時刻只有一個線程被CPU執行,其他線程就被掛起,除非有多個CPU。每當來了新任務,人要么將這個任務放到一匹馬的任務序列中,要么從馬廄中另外拉一匹馬出來執行這個任務:從線程池取出線程執行任務。
當沒有任務時,馬廄被暫時解散,馬廄里的馬都放歸牧場:線程池被shutdown。新來了任務,人就從牧場上趕馬進入馬廄:生成線程池。趕馬進馬廄的時候,你可以一開始就確定好趕幾匹馬進來,比如5匹馬——Ececutors.newFixedThreadPool(5)?,或者只要一匹馬——Executor.newSingleThreadExecutor()。假如開始不知道要幾匹馬,就用Executor.newCachedThreadPool()來為你服務,當然這要增加CPU開銷——你得時刻準備著去牧場找馬。
進程,就是一個完整的、封閉的任務。比如,用馬拉車是一個任務,用馬把小麥拉到磨坊、再拉磨給小麥磨成面粉、再把磨好的面粉拉到集市上賣掉也是一個任務。前者用一匹馬比較簡單,因為只要套一次車,換馬的話要套車、解套再套到另外一匹馬身上,所以這種任務常常用一個線程就能很好地解決。后者,則需要好幾匹馬來做,所以用多個線程來驅動會更好。
鎖,是用來保證對象在一個進程對它的訪問結束之前,專屬于此線程的工具。比如,一包小麥被馬拉到磨坊去,只有拉到了,磨坊里的馬才能拉磨磨面粉;也只有磨面粉完成了,面粉才能被拉到集市上出售。如果沒有鎖,可能會出現石磨空轉、小麥和面粉混合在一個袋子里的情況。
線程間的通信,是為了相互通知情況。比如,一匹馬把小麥拉到磨坊了,鈴鐺會響,告知磨坊的馬可以拉磨了——用notify或者notifyAll來告知正在wait的線程可以嘗試采取動作了。
?
用這個比喻簡單地描述了一下多線程編程的一些基本概念,比喻可能不太恰當,歡迎大家交流。
轉載于:https://www.cnblogs.com/wenmingCode/p/10200784.html
總結
以上是生活随笔為你收集整理的多线程编程的初步形象化理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 保护性拷贝(defensive copy
- 下一篇: Unity3D 随机颜色(RGB/HSV