簡單的來說
一個程序至少有一個進程,一進程至少有一個線程
線程的劃分大小小于進程,所以使得多線程程序的并發(fā)性能高!
而且,進程在執(zhí)行的過程中,有著自己獨立的內存單元,而多個線程共享內存,從而極大的提高了程序的運行效率.
而他們的區(qū)別在于:
每個獨立的線程有一個程序運行入口,順序執(zhí)行序列和程序的出口.
但是線程不能夠獨立運行,必須是依賴程序,由程序提供多個個線程的執(zhí)行控制!
從邏輯上看,多線程的意義在于一個程序中,有多個執(zhí)行部分可以同時執(zhí)行.但操作系統(tǒng)并沒有將多個線程看做多個獨立的應用,來實現(xiàn)進程的管理和資源分配,這是最重要的區(qū)別,也是最大的不同.
為什么這么說列?
* 進程,是一個具有獨立功能的程序,關于某個數(shù)據(jù)集合上的一次遠行活動,進程是系統(tǒng)進行資源分配和管理的獨立單位.
* 線程是進程的一個實體,是cpu在調度和分配的基本單位.
* 線程自己基本上不擁有系統(tǒng)的資源,它只是有一些運行必不可少的資源?但是它可以與同一進程中的其他線程共享進程所擁有的全部資源
!! 這同時也是 多線程的安全問題
因為多個線程同時訪問同一個數(shù)據(jù),而現(xiàn)在的cpu 主頻,最低的也是1GHz吧, 也就是說 cpu 高達每秒幾十億的計算,你同一條數(shù)據(jù),在 幾個線程中,以幾十億的概率被幾個線程同時訪問,不出現(xiàn)安全性才怪!
(如何解決此問題:把線程死鎖就可以有效的避免,數(shù)據(jù)重復讀取的問題了)
然后,創(chuàng)建線程有哪些方式?
- 剛才也說了,一個進程至少有一個線程,當我們不做任何的處理的時候,就是單進程.
而實現(xiàn)多線程- 要么繼承Thread類,創(chuàng)建線程子類
重寫run 方法,這個run方法的方法體就代表了線程要完成的任務,大部分javaee工程師,都喜歡叫這個方法體為,執(zhí)行體
(然后調用對象的,start()方法,啟動該線程) - 要么就實現(xiàn)Runnable 接口創(chuàng)建線程類
一樣的,重寫run方法,
start啟動
但是要注意:
創(chuàng)建Runnable實例類的實例,是作為Thread的target來創(chuàng)建Thread對象的,這個Thread才是線程的真正對象.
- 要么繼承Thread類,創(chuàng)建線程子類
思維導圖如下: