線程與進程?
線程是操作系統調度的最小單元,而進程是系統進行資源分配和調度的一個基本單位。
簡單理解:進程是程序的一次執行,線程可以理解爲進程中的執行的一段程序片段
360解釋:進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。
線程狀態:
線程從被創建到終止一共有六種狀態,分別是初始狀態、運行狀態、阻塞狀態、等待狀態、超時等待狀態以及終止狀態。
如何判讀線程處於什麼樣的狀態
當線程被New實例化後,就意味着線程處於了初始狀態
當線程調用Thread.start方法後,線程就進入了運行狀態,表明線程只要得到系統資源就可以直接運行。其中運行狀態分爲就緒和運行中,就緒狀態指的是線程在等待系統CPU等系統資源,當獲得系統資源則真正進入運行狀態
- 在就緒狀態與運行中狀態之間需要系統調度,當線程調用sleep、wait、join等方法時,線程就會進入等待狀態或超時等待狀態,進入等待狀態的線程需要其他線程的通知(notify、notifyAll、unpark)才能返回到可運行狀態,而超時狀態則時增加了超時後自動返回運行狀態的機制。
- 在運行狀態中,如果未獲取到鎖線程就會進入阻塞狀態(被阻止在進入synchronized方法),直到獲取鎖或者被打斷纔可繼續執行程序或者返回
- 當線程執行完Runnable的run方法之後就進入了終止狀態
java等待/通知機制
是什麼?
Java等待/通知機制指的是一個線程A調用了對象的wait方法進入等待狀態,而另外的一個線程B調用對象的notify或者notifyAll方法,線程A感知到這種變化過後從對象的wait方法返回進行後續的代碼操作。最終這兩個線程的代碼執行是建立在這個對象上面進行交互的
有什麼用?
實現“做什麼”和“怎麼做”之間的功能解耦,讓程序之間具有良好的可伸縮性。“做什麼”由消費者決定,它去通知相應的消費者實現做什麼,而消費者接收到通知後去實現怎麼做。
等待/通知的經典範式:
等待方(消費者):
//獲取鎖
synchronized(對象){
//條件滿足進行後續操作,完成怎麼做
//循環檢查條件不滿足則繼續等待
while(條件不滿足){
對象.wait();
}
滿足後的代碼執行
}
通知方(生產者)
//獲取鎖
synchronized(對象){
改變條件
對象.notifyAll();
}
創建線程的幾種方式
看過下面這篇文章,真的總結得太好了,我着這辣雞就別去關公面前耍大刀了,附上大佬的鏈接
http://blog.csdn.net/longshengguoji/article/details/41126119