寫在前邊程序員
你們好,今天又來更新了,今天更新的乾貨在我看來很重要的。想知道爲啥那麼重要嗎?哈哈,還有比面試找工做重要的事情嗎?尤爲是那些百度、網易、騰訊、頭條等巨頭公司問的你能懷疑人生。即便不去這些大公司面試,你去面試一些中小型公司,固然是你知道的越多越深刻才能突出你的優點來啊!今天小編我看到一篇文章說的是有些程序員對之後的目標很迷茫,那我今天就不得不提醒一下了。若是如今對將來挺迷茫的,不妨把像騰訊、網易、阿里等這樣的大公司爲目標吧,最起碼有個動力在背後推着你努力。送給大家一句話 「人往高處走,水才往低處流」。面試
線程與進程編程
1、進程和線程的含義 服務器
進程:進程是擁有資源的基本單位。多線程
線程:線程是CPU調度的基本單位。併發
2、舉個例子ide
☛ 好比咱們手機有兩個進程要進行,一個是便籤,另外一個是絕地求生。線程
☛ 便籤進程運行要打開保存文本的文件,這裏的「打開文件」咱們就叫它資源;絕地求生進程要經過監聽用戶按鍵事件,這裏的「監聽用戶按鍵事件」叫作它的資源。3d
☛ 咱們都知道便籤軟件有自動保存的功能這個功能在t1線程中執行,用戶編輯文本在t2線程中執行;絕地求生假設也有兩個線程t3和t4,t3線程負責QE 歪頭,t4線程負責開槍。上邊我所給出的概念是『線程是CPU調度的基本單位』CPU在調度的時的基本單位不是打開便籤和絕地求生兩個進程,而是t一、t二、t三、t4四個線程。blog
圖解:
★ 注意:一個進程至少要有一個線程
☛ 若是一個進程沒有多線程,你玩絕地求生的時候怎麼能邊歪頭邊射擊呢?單線程只能幹一件事,事件不能併發進行,浪費 CPU 資源。所謂的多進程就是絕地求生運行在後臺的同時,你使用便籤進行文字記錄。進程是一個軟件在運行,線程就是執行進程中的線程代碼片斷。
3、線程池
概念:
① 有了多線程編程爲什麼還要引進線程池的概念呢?
線程池對於咱們開發者建立來講很簡單方便,可是對服務器來講負擔很沉重,每一個用戶請求登陸軟件都要開啓一個線程,建立的線程就會不少,你想一想那麼多的線程去競爭 CUP 資源,持續切換,這個 CUP 的調度不是要累死的節奏嗎?爲了解決這個問題,就引進了線程池的概念,經過線程池提早建立必定數量的線程,不用等任務來了在建立,提早建立線程的做用就是當系統有任務來了以後就直接去執行任務。若是有任務來了,線程池的線程就會去執行任務,執行完後不銷燬直接回到線程池等待執行下一個任務。咱們所說的線程就是代碼的執行,動態建立的。
② 線程的建立是經過 .start 開啓的,一旦開啓線程就會自動執行 run 方法。那麼一個新的問題來了,任務還沒來呢?提早建立一個線程以後直接執行 run 方法了。
其實線程池還有重要的一點,就是當線程池剛建立時,讓其進入堵塞狀態,等待系統任務的到來;若是任務來了,咱們就把第一位線程同窗叫醒拿着老師的任務去幹活。
③ 怎麼讓線程池進入堵塞狀態呢?
BlockingQueu 做爲線程容器,能夠爲線程同步提供有力的保障。BlockingQueue 很容易理解,它就是一個容器,用來存放系統的任務的。線程池的線程調用它的 take() 方法取出任務進行執行,若是 BlockingQueue 沒有可執行任務,該線程就會阻塞;該線程能夠經過調用 put 方法放入任務,若是任務滿了線程也會阻塞。
圖解:
就是說在線程池中的每一個 Run 方法中都要有一個循環判斷 BlockingQueue 有沒有可執行的任務,若是有就去執行,執行完回來再 BlockingQueue 中繼續獲取任務,若是 BlockingQueue 沒有可執行任務了,線程就處於阻塞等待狀態。