天天看點

#打卡學習##JAVA#多線程

多線程

一、什麼是程序

程序是系統進行資源配置設定和調用的獨立單元,每一個程序都有它的獨立記憶體空間和系統資源。

Cpu執行的最小機關是什麼? 時間片. 執行哪一個 線程.

單核的電腦上面, 我現在一個程序裡面有若幹個線程,去執行一定任務的時候,總時間會不會變少?

二、單程序作業系統和多程序作業系統的差別

a) 多程序作業系統是指在同一個時段内可以執行多個任務(時間片)

b) 邊聽音樂邊敲代碼,CPU切換非常快

c) Windows作業系統-多程序作業系統

d) Dos作業系統-單程序的作業系統

e) Linux作業系統-多使用者多程序的作業系統

思考:現在的多核CPU是否可以讓系統在同一個時刻可以執行多個任務嗎?

三、什麼是線程,了解線程和程序的關系

線程是程序裡面的一條執行路徑,每個線程同享程序裡面的記憶體空間和系統資源

我們應用的軟體有哪些是多線程的應用?

四、編寫多線程的應用程式?

a) 建立一個自己的線程類,繼承Thread,重寫run方法

b) 建立一個自己的任務類,實作Runnable接口,重寫run方法

c) 如何正确啟動一個新的線程?

d) 另外兩種實作多線程的方式有何差別?

經典面試題:請問當我們編寫一個單純的main方法時,此時該程式是否為多線程的?為什麼?

五、線程的優先級

注意: 優先級是java自己設定的一個值,由大到小,優先級高. 但是! 作業系統不會管你優先不優先.

使用 setPriority(1-10) 來設定優先級.

執行時間較長的設定低的優先級,保證不會獨占cpu.

六、讓線程休眠 sleep

Thread.sleep(1000);

七、線程的禮讓 yield

正确了解線程的禮讓,暫停目前正在執行的線程對象,并執行其他線程。

練習:建立兩個線程A,B,分别各列印100次,從1開始每次增加1,其中B一個線程,每列印一次,就yield一次,觀察實驗結果

Thread.yield()方法作用是:暫停目前正在執行的線程對象,并執行其他線程。

yield()應該做的是讓目前運作線程回到可運作狀态,以允許具有相同優先級的其他線程獲得運作機會。是以,使用yield()的目的是讓相同優先級的線程之間能适當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程排程程式再次選中。

結論:yield()從未導緻線程轉到等待/睡眠/阻塞狀态。在大多數情況下,yield()将導緻線程從運作狀态轉到可運作狀态,但有可能沒有效果。

八、線程的合并 join

主線程和子線程同時運作,滿足一定條件後,讓子線程先運作至結束

練習:主線程和子線程各列印200次,從1開始每次增加1,當主線程列印到10之後,讓子線程先列印完再列印主線程

Join: 如果是 my.join(); 則:阻塞調用此方法的線程,直到my線程完成後再執行.