LZ這幾天看到一些java初級工程師就像我們應屆畢業生在去面試的時候都會或多或少問到多線程的概念,確實,這部分的內容對一個搞開發的十分的重要,掌握了就是你的優勢。LZ將部分重點內容總結一下,以便和大家共享以及方便自己以后查看。
如下圖所示,進程是一個獨立的運行環境,可以被稱作一個程序或者一個應用,而線程就是在進程中的一個任務,即一個執行路勁,像我們平時打開電腦的任務管理器,里面看到的都是正在運行的進程,QQ是其中的一個,而我們在QQ中聊天發表說說則是一個個的線程。
圖1:進程和線程的關系圖
在一個應用程序中,同時有多個不同的執行路徑,這就是多線程,舉個例子就是在用微信聊天的時候還去對微信其他部分的東西進行操作。
一句話:提高了程序的運行效率。
這個問題很好理解,要點就是在線程執行某個請求時,是否需要一段時間返回信息才能繼續往下執行,同步是需要的,異步不需要,它是直接執行廈門的操作,不管其他進程的狀態。如下圖: 
創建線程基礎的有兩種方法,一種是繼承thread類,重寫run方法;一種是繼承Runnable接口,重寫run方法;注意啟動一個線程用.start方法,這里需要注意的是與run方法的區別,調用run方法只是正常的調用普通的方法,而.start方法才是啟動一個線程;另外考官可能會問你這兩種方式那種比較好,回答應該是后者實現接口比較好,原因是實現接口的方式還可以繼承其他類,但是我們的類卻只能繼承一個父類(Java類只能繼承一個父類),所以前者會產生局限性。
就是在多個線程共享同一個數據會受到其他線程的干擾,可能會造成死鎖,程序處于無限等待中。解決辦法是采取線程同步技術,用上鎖(synchronized),讓一個線程執行完了,再讓其他線程執行。上面提到死鎖概念,覺得有必要提一下:
就是兩個或兩個以上的線程都在等待對方執行完畢才能繼續往下執行就發生了死鎖,線程處于無限的等待中。 死鎖有四個條件: 禁止搶占 no PReemption 持有和等待 hold and wait 互斥 mutual exclusion 循環等待 circular waiting
當線程A要去讀取B線程已經刪除的數據的時候,就會出現錯誤。解決死鎖有幾個方法,最簡單的方法:重啟系統,更好的方法是終止一個線程的運行,可以把一個線程或多個線程回滾到前一狀態。 未完待續… (后面會補充線程池,生產者消費者模式等知識,都是基礎需要掌握的內容。)
新聞熱點
疑難解答