標籤:

線程概念、創建及常見方法

線程概念、創建及常見方法

來自專欄 core java讀書筆記

多線程可以在同一時間做多種事情。

線程概念

進程:啟動一個lol.exe叫一個進程,再啟動一個r6.exe是另一個進程。

線程:Lol中英雄擊殺,裝備購買等等,都是用多線程實現。

上面是how2j.cn上面用Lol舉的例子,然後總結如下:

  • 進程是資源分配的最小單位,線程是程序執行的最小單位。
  • 進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。

創建線程之繼承Thread類型

現在有一個Hero類,如下

我們不使用多線程模擬一下中路和下路的對線場景:

運行結果:

但實際情況一般是各路的戰鬥在同時進行,這樣一個用兩個循環分開模擬顯然就有問題了,我們使用多線程,設計一個類KillThread繼承Thread並且重寫run方法

測試及結果如下:

這樣一來顯然更合理一些,這裡我們就是用繼承Thread類,並重寫run方法來實現的。

而創建多線程一共有三種方式。

創建多線程之實現Runnable介面

實現了Runnable介面,就會有run方法,但是直接調用run方法,並不會啟動一個新的線程。

而是要把實現了Runnable介面的對象傳給Thread的構造方法,然後藉助Thread對象的start來啟動新的線程。

所以,在創建Thread對象的時候,把battle1作為構造方法的參數傳遞進去,這個線程啟動的時候,就會去執行battle1.run()方法了。

創建多線程之匿名類實現

能繼承和實現介面,那自然能使用匿名類來實現。

線程常見的方法

暫停當前線程:sleep方法,就是在Hero類裡面表示攻擊間隔的那個sleep方法。參數單位是毫秒。值得注意的是線程sleep過程中可能會被停止,sleep方法可能拋出InterruptedException異常,因此需要try...catch...捕獲。

加入到當前線程:join方法,所有進程至少會有主線程,隱式的。從main方法開始執行這個線程就存在了。join方法可以使得一個線程加入主線程,當這個線程結束之後,主線程才會繼續往下運行。舉例如下:

這個也有可能拋出InterruptedException。

線程優先順序:setPriority我們上面演示的兩個線程可以稱為競爭關係,兩個線程在競爭CPU資源,而且我們並沒有設置優先順序,誰在打誰的優先順序是平等的,但是可以setPriority設置優先順序,優先順序高的有更大概率佔用充足的CPU資源。為了能明顯看出來優先順序關係就不讓sleep了:

結果是明顯看到下路的對決更加激烈了一些。。

臨時暫停線程:

守護線程:調用線程對象的setDaemon方法傳入true參數來設置該線程為守護線程,當一個進程中的所有線程都是守護線程時候,這個進程就結束了。


推薦閱讀:

心臟彩超的學習巧記
無量壽經科註第四回學習班【第24集】
無量壽經科注第四回學習班  (第一六O集)
與學習有關的名言,對聯,座右銘
粵語學習超酷

TAG:學習 |