序言
說說今天遇到的一件小事吧,在遇到問題,查詢答案時,看到很多人的部落格裡面都有提到關鍵字眼,可讓人覺得可恨的是,大多數人寫的博文中,基本上都是照著書上的語言發表的,看了跟沒看一樣,沒有一點通俗的語言和自己關於該知識點的講解,也有可能是覺得太簡單,不用做解釋,但是個人感覺,寫博文,在一些自己都需要思考一段時間去理解的東西,應該把自己思考的過程,如何理解的寫下來,而不是就把精華的部分複製黏貼上去,個人感覺沒什麼用,回想一下再寫計算機網路教程學習歷程的博文中,自己也有類似的情況,應該改正過來,在乎的是每篇博文的質量,而不是數量,不能有那種拼命往上面懟文章,來顯示自己寫了很多東西,以此用來面試,我覺得更是無用,寫博文不為別人,是為了鞏固我們的知識,和發表自己對一些問題的見解,這樣才能真正的幫助到自己。開始今天的五題面試吧。
----WH
一、程式和執行緒的區別是什麼?
自己講解:
程式:拿電腦來說,在電腦上後臺執行了很多程式,那就是程式
執行緒:為了完成一個程式的執行,可能程式中還有很多分支在一起執行共同來完成這個程式,分支的執行就是執行緒
也就是說:程式中包括很多執行緒,
參考答案:
程式是執行著的應用程式,而執行緒是程式內部的一個執行序列。一個程式可以有多個執行緒。執行緒又叫做輕量級程式。
自我評價:
大概理解,但是語言描述的不好,應用程式下有很多執行序列。 不應該說分支。
1、程式:執行的應用程式,通俗一點,在開啟電腦的工作管理員中,就有很多應用程式,也就是程式
2、執行緒:程式內部的一個執行序列,通俗的講,就是一個程式的執行,有很多執行緒在同時執行來共同維護該程式的執行
二、建立執行緒有幾種不同的方式?你喜歡哪一種?為什麼?
自己解答:
好久不用執行緒,這題直接不會了,哈哈,
參考答案:
有三種方式可以用來建立執行緒:
繼承Thread類
實現Runnable介面
應用程式可以使用Executor框架來建立執行緒池
實現Runnable介面這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的物件的情況下,這需要多繼承(而Java不支援多繼承),只能實現介面。同時, 執行緒池也是非常高效的,很容易實現和使用。
自我評價:
隔得比較久,但是印象中也是隻有兩種建立執行緒的方式,一個是繼承,一個是實現介面。
1、繼承Thread類,重寫run方法,在run方法中寫該執行緒要執行的任務,然後再在要執行該執行緒時,new出物件來,物件.start(),啟動該執行緒
2、實現Runnable介面,實現其中的run方法,new出該物件A來,Thread thread = new Thread(A); 這樣,thread.start(),就能啟動該執行緒。
注意:繼承Thread類侷限於單繼承,所以實現Runnable介面,就能在繼承別的類。其實本質都一樣,Thread類也實現了Runnable介面。
3、使用executor框架來建立多執行緒。可以自行百度去了解一下。
三、概括的解釋下執行緒的幾種可用狀態。
自我解答:
建立狀態、執行狀態、暫停狀態、死亡狀態
參考答案:
1. 新建( new ):新建立了一個執行緒物件。
2. 可執行( runnable ):執行緒物件建立後,其他執行緒(比如 main 執行緒)呼叫了該物件 的 start ()方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲 取 cpu 的使用權 。
自我評價:不清清楚這個內容,
1、五個狀態 新建狀態 -- 可執行狀態 -- 執行狀態 -- 阻塞狀態 -- 銷燬狀態
2、阻塞狀態
等待阻塞:使用wait(),然後再等待佇列裡面呆著。等待依次被呼叫
同步阻塞:呼叫了某個帶鎖的方法,當前鎖被其他執行緒給拿到了,就需要等待其他執行緒用完,然後再拿到該鎖,
其他阻塞:比如 執行了 sleep、或者 join 方法,使之執行緒進入了睡眠或者要等待別的執行緒執行完才輪到自己。
四、同步方法和同步程式碼塊的區別是什麼?
自我解答:
這個也不清楚。
參考答案:
區別:
自我評價:
1、同步的單詞是: synchronized 非同步的單詞是: asynchronized
2、同步方法和同步程式碼塊只得是用synchronized關鍵字對方法加鎖,
3、同步方法: synbhronized只對方法加鎖,作用的範圍就是,如果該類物件呼叫了該方法,則獲得鎖,其他執行緒不管是呼叫該帶鎖的方法還是非鎖方法都必須等待
4、同步程式碼塊:對方法或者任意程式碼加鎖,不同的是,只對獲得該段程式碼的鎖機制生效,意思就是,當A執行緒獲得了該段程式碼的鎖,B執行緒照樣執行其他非帶鎖的方法。
五、在監視器(Monitor)內部,是如何做執行緒同步的?程式應該做哪種級別的同步?
自我解答:
幾個多執行緒的題目頓時懵逼了,多執行緒這塊很弱,記不住,以前看了一點,都差不多忘記了。
參考答案:
監視器和鎖在Java虛擬機器中是一塊使用的。監視器監視一塊同步程式碼塊,確保一次只有一個執行緒執行同步程式碼塊。每一個監視器都和一個物件引用相關聯。執行緒在獲取鎖之前不允許執行同步程式碼。
在 java 虛擬機器中, 每個物件( Object 和 class )通過某種邏輯關聯監視器,每個監視器和一個物件引用相關聯, 為了實現監視器的互斥功能, 每個物件都關聯著一把鎖. 一旦方法或者程式碼塊被 synchronized 修飾, 那麼這個部分就放入了監視器的監視區域, 確保一次只能有一個執行緒執行該部分的程式碼, 執行緒在獲取鎖之前不允許執行該部分的程式碼 另外 java 還提供了顯式監視器( Lock )和隱式監視器( synchronized )兩種鎖方案
自我評價:
1、有關於java虛擬機器的一部分,在講解如何實現鎖機制的。這個感覺有點超出我自己的能力了,等看到了應該會知道,現在當時瞭解一下,有這個東西。