WEB入门浅谈17
WEB入門淺談17
- 多線程
- 線程的屬性
- join
- 進程和線程
- 補充
多線程
進程是為了實現并發編程的效果,但為了追求更高的效率就引進了線程
創建一個進程和銷毀一個進程,開銷比較大(進程管理中存在一些系統分配的資源,申請和釋放這些資源不是一個容易的事),因此就希望能夠更高效,更輕量的完成并發編程。于是就通過線程來完成
線程也被稱為 輕量級進程
每個線程就對應到一個 獨立的執行流 ,在這個執行流里就可以完成一系列的指令。有多個線程,就對應的有多個執行流,就可以并發的完成多個系列的指令了
一個進程包含了多個線程。一個進程從操作系統中申請了很多資源,進程統一對這些資源進行管理,這個進程內的多個線程,就共享了這些資源。
進程具有 獨立性 ,進程與進程之間沒有影響(一個進程的創建和銷毀不會影響到其它進程)。而線程則不然,如果一個線程出問題了,就可能會影響整個進程的工作。
單進程,單線程:一個人去做一件事。(效率太低)
多進程,單線程:兩個人分開去做一件事。(效率提升了,但是資源需要的就多了)
單進程,多線程:兩個人一起來做一件事。(效率提升了多余的資源節省了)
創建線程就比創建進程的開銷更低
雖然線程越多,效率可能就會越高。但并不是線程越多越好,一旦線程數量太多就會擁擠不堪,多個線程為了爭取CPU資源就會造成更多的開銷(線程多了,調度的開銷也就大了)
要使效率達到最高,那就需要視情況而定創建多少個線程了。例如:
在一臺8核CPU的主機上創建進程,那么創建多少個線程就取決于每個線程的執行的任務里,有多少工作是占用CPU,有多少是等待I/O(阻塞)如果線程的工作是純CPU(無阻塞),那么線程創建8時,效率達到最高。如果線程只有10%占用CPU,那么線程就可以創建到80達到最高效率。(理論)
但是這樣做也會出現幾個問題,效率雖然高了,開銷也小了,但是在工作時,多個線程可能會出現 爭搶問題(搶著干一件事,可以理解為分配不均)。也有在工作時,某個線程一直在就緒狀態,但是一直輪不上,此時也會出現問題。這個時候就需要考慮線程安全問題。
Java中為了方便操作線程,有Thread這樣的類來表示線程
不同的系統上,對于線程這里提供的API是不一樣的。Java中都通過Thread類來包裝好了
Java中的一個Thread對象就和操作系統內部的一個線程是一一對應的
調用start才是創建新線程,調用run只是一個簡單的函數調用
線程的屬性
getId() 獲取當前線程id
getName() 獲取當前線程名稱
getState() 獲取當前線程狀態(此處狀態指的是Java的線程狀態,與操作系統中的進程線程狀態類似但不一樣)
getPriority() 獲取當前線程的優先級
isDaemon() 查看當前線程是否為守護線程/后臺線程
守護線程:主線程(main)結束后,守護線程也不會繼續執行了,進程退出,
前臺線程:主線程(main)結束后,前臺線程繼續執行,進程仍然存在
isAlive() 判斷線程是否結束
isInterrupted() 判斷線程是否中斷
public static Thread currentThread() 獲取當前線程對象
public static void sleep(long millis) 休眠
join
join起到的作用是等待某個線程結束
如果在main方法中用t.join() 那么主線程就會進入阻塞狀態,等待t線程結束,t線程結束后在運行main方法中join之下的代碼。
如果等待的線程已經結束,那么就繼續執行下面的代碼,就不會進入阻塞狀態了
也可以傳入一個參數,令主線程等待的超時時間多少ms,如:t.join(1000),那么主線程就會進入阻塞狀態等待,最多等待1s。傳入兩個參數時,第一個參數的單位為ms,第二個參數的單位時ns。
進程和線程
進程包含線程
進程之間是相互隔離的(一個進程的結束不會影響到其它進程的正常工作)
同一個進程的線程之間,共享了一些資源,尤其是內存資源(線程與線程之間,容易互相干擾),一個線程掛了,就有可能導致整個進程都無法工作
進程是系統資源分配和管理的最小單位,線程是調度執行的最小單位
補充
線程與線程之間是共享資源的,而JVM是內存區域劃分的。JVM也是一個進程(java進程)JVM在啟動的時候會申請一大片內存資源,再把這些資源劃分成若干份區域(方法區、堆:多個線程共享的區域。棧、程序計數器:有自己的區域。方法區和堆共享一塊區域,其它的都有自己的區域)
但是如果站在操作系統的角度上來看,整個進程的虛擬地址空間,都是由若干個線程來進行共享的
通過代碼感受多線程編程
public class Test {public static void main(String[] args) {// 雖然此處沒有創建線程,但是還是會有一個線程來作為main方法的執行流System.out.println("多線程");while (true){}} }通過jconsole命令觀察線程
總結
- 上一篇: 怎么将heic转换格式,如何打开heic
- 下一篇: 钩子函数-建立键盘鼠标动作记录与回放