線程概念、創建及常見方法
來自專欄 core java讀書筆記
多線程可以在同一時間做多種事情。
線程概念
進程:啟動一個lol.exe叫一個進程,再啟動一個r6.exe是另一個進程。
線程:Lol中英雄擊殺,裝備購買等等,都是用多線程實現。
上面是http://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:學習 |