最近 因爲時間比較充足 看了張孝祥將的java多線程實戰,看了以後想結合本身的理解對java的多線程這個知識進行一個總結,鑑於面試中常常會問多線程相關的知識,而咱們不少人因爲本身工做年限和工做中接觸到的多線程的知識其實並非不少,因此在面試的時候會比較爲難,但願我對這個的總結能夠對你們掌握多線程有一些理解,固然了我本身的學習後的總結並 不必定都是對的,仍是但願你們能夠一塊學習。好了這是我寫這個隨筆的一個願望吧算是,本身學會了也但願通道中人也能夠學會,let go。。。。html
我對多線程的學習總結按照下面的一個邏輯和路線來講明:java
1 實現多線程的兩種方法以及區別面試
2 java中定時器的實現及原理spring
3 傳統的實現線程互斥的一些技術及不一樣之處安全
4 線程的同步以及線程範圍內共享變量的實現方式多線程
5 ThreadLocal這個強大東東的侃大山,以及咱們在平時的開發中 在哪裏其實在不知不覺中已經在使用這個東東了呢。。框架
6 java中一些不常用的線程安全也就是原子性操做的類的說明eclipse
7 java5 提供的線程庫 java.util.concurrent包的應用介紹。主要是Executors類的使用。這個東西你們都知道可是裏面不少東西應該都沒有接觸過。工具
8 java5 中的Callable與Future的應用 實現線程處理結果的學習
9 線程中的鎖以及讀寫鎖的應用,以及鎖與sychronized在實現線程互斥方面的區別
10 java中的condition條件的用途
11 Semaphere信號燈。以及一些同步工具類的使用
12最後說一下有關阻塞隊列 以及消息隊列。
13 作一個總結。
今天就先說一個實現線程的兩種方法,我想不少求職找工做的只要問到有關線程的這個問題應該是必問的,哈哈 我就被問到過好幾回。但是對這個問題除了能夠說出集成Thread類和實現runnable接口兩種方式以外你還能說出一些其餘的嗎,若是不能的話那麼能夠判定你的此次面試有關線程這塊應該是失敗的。說到這裏咱們換是先去看看源碼去吧:java.lang.Thread: 的構造方法init(null, null, "Thread-" + nextThreadNum(), 0L);咱們看init的具體實現:
紅色的字是對這個初始化方法的一個解釋。
這裏面有關secyrityManager java 安全管理器的詳細知識能夠去這裏瞭解---http://blog.sina.com.cn/s/blog_48a45b950100f2lc.html
這時候我想你可能會問個人,你這不就是對threan的初始化過程作了一個介紹嗎,還有別的嗎,彆着急立刻來,這時候咱們知道啓動一個線程的方法是start(),哪咱們就看看Thread類中的start()方法的源碼:
看這裏的start方法,不論是咱們本身集成的線程子類重寫的run方法也好,咱們看啓動的start方法是不變的,看start()方法的實現是先去判斷一下當前線程的狀態是否正確,若是正確就將這個線程添加到線程組中。這裏咱們換看到了一個start0()的方法,並且是一個native修飾的方法,
這時候咱們再看run方法的實現,裏面有一個target 從上面的定義中咱們能夠看到target其實就是一個runnable接口,這個時候我覺着你應該明白了唄,其實不論是集成thread仍是實現runnable,其實底層都是同樣的,但這時候可能會問哪爲何要這樣的方式來實現呢,我也查了一些資料,我覺着這樣說是頗有道理的:
① 一個類只能繼承一個父類,存在侷限;一個類能夠實現多個接口
② 在實現Runable接口的時候調用Thread的Thread(Runnable run)或者Thread(Runnable run ,String name)構造方法建立進程時,使用同一個Runnable實例,如上程序中使用的都是rt,則創建的多線程的實例變量也是共享的;
可是經過繼承Thread類是不能用一個實例創建多個線程;
故而實現Runnable接口適合於資源共享;
固然,繼承Thread類也可以共享變量,能共享Thread類的static變量;
③ Runnable接口和Thread之間的聯繫:
public class Thread extends Object implements Runnable 能夠看出Thread類也是Runnable接口的子類;
好了我想對這兩張實現線程的方式的代碼就沒必要寫了,你們應該都會。若是不會的話先打開eclipse本身寫一個再說。
2 java中有關定時器的實現:
在咱們接觸到的定時器中主要由spring框架提供的quartor和java原生自帶的Timer類。好了這個咱們留在明天再說吧。對寫的上述有不一樣意見的歡迎你們多多評論共同探討。。