激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

Java多線(xiàn)程常見(jiàn)面試問(wèn)題及解答

時(shí)間:2023-04-01 22:03:37 面試問(wèn)題 我要投稿
  • 相關(guān)推薦

Java多線(xiàn)程常見(jiàn)面試問(wèn)題及解答

問(wèn)題:進(jìn)程和線(xiàn)程的區別

Java多線(xiàn)程常見(jiàn)面試問(wèn)題及解答

解答:一個(gè)進(jìn)程對應一個(gè)程序的執行,而一個(gè)線(xiàn)程則是進(jìn)程執行過(guò)程中的一個(gè)單獨的執行序列,一個(gè)進(jìn)程可以包含多個(gè)線(xiàn)程。線(xiàn)程有時(shí)候也被稱(chēng)為輕量級進(jìn)程.

一個(gè)Java虛擬機的實(shí)例運行在一個(gè)單獨的進(jìn)程中,不同的線(xiàn)程共享Java虛擬機進(jìn)程所屬的堆內存。這也是為什么不同的線(xiàn)程可以訪(fǎng)問(wèn)同一個(gè)對象。線(xiàn) 程彼此共享堆內存并保有他們自己獨自的?臻g。這也是為什么當一個(gè)線(xiàn)程調用一個(gè)方法時(shí),他的局部變量可以保證線(xiàn)程安全。但堆內存并不是線(xiàn)程安全的,必須通 過(guò)顯示的聲明同步來(lái)確保線(xiàn)程安全。

問(wèn)題:列舉幾種不同的創(chuàng )建線(xiàn)程的方法.

解答:可以通過(guò)如下幾種方式:

•  繼承Thread 類(lèi)

•  實(shí)現Runnable 接口

•  使用Executor framework (這會(huì )創(chuàng )建一個(gè)線(xiàn)程池)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Counter extends Thread {
 
    //method where the thread execution will start
    public void run(){
        //logic to execute in a thread   
    }
 
    //let’s see how to start the threads
    public static void main(String[] args){
       Thread t1 = new Counter();
       Thread t2 = new Counter();
       t1.start();  //start the first thread. This calls the run() method.
       t2.start(); //this starts the 2nd thread. This calls the run() method. 
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Counter extends Base implements Runnable{
 
    //method where the thread execution will start
    public void run(){
        //logic to execute in a thread   
    }
 
    //let us see how to start the threads
    public static void main(String[] args){
         Thread t1 = new Thread(new Counter());
         Thread t2 = new Thread(new Counter());
         t1.start();  //start the first thread. This calls the run() method.
         t2.start();  //this starts the 2nd thread. This calls the run() method. 
    }
}

通過(guò)線(xiàn)程池來(lái)創(chuàng )建更有效率。

問(wèn)題:推薦通過(guò)哪種方式創(chuàng )建線(xiàn)程,為什么?

解答:最好使用Runnable接口,這樣你的類(lèi)就不必繼承Thread類(lèi),不然當你需要多重繼承的時(shí)候,你將 一籌莫展(我們都知道Java中的類(lèi)只能繼承自一個(gè)類(lèi),但可以同時(shí)實(shí)現多個(gè)接口)。在上面的例子中,因為我們要繼承Base類(lèi),所以實(shí)現Runnable 接口成了顯而易見(jiàn)的選擇。同時(shí)你也要注意到在不同的例子中,線(xiàn)程是如何啟動(dòng)的。按照面向對象的方法論,你應該只在希望改變父類(lèi)的行為的時(shí)候才去繼承他。通 過(guò)實(shí)現Runnable接口來(lái)代替繼承Thread類(lèi)可以告訴使用者Counter是Base類(lèi)型的一個(gè)對象,并會(huì )作為線(xiàn)程執行。

問(wèn)題:簡(jiǎn)要的說(shuō)明一下高級線(xiàn)程狀態(tài).

解答:下圖說(shuō)明了線(xiàn)程的各種狀態(tài).

• 可執行(Runnable):當調用start()方法后,一個(gè)線(xiàn)程變?yōu)榭蓤绦袪顟B(tài),但是并不意味著(zhù)他會(huì )立刻開(kāi)始真正地執行。而是被放入線(xiàn)程池,

由線(xiàn)程調度器根據線(xiàn)程優(yōu)先級決定何時(shí)掛起執行。

1
2
MyThread aThread = new MyThread();
aThread.start();                   //becomes runnable

• 執行中(Running):處理器已經(jīng)在執行線(xiàn)程的代碼。他會(huì )一直運行直到被阻斷,或者通過(guò)靜態(tài)方法Thread.yield()自行放棄執行的機會(huì ),考慮到場(chǎng)景切換所帶來(lái)的開(kāi)銷(xiāo),yield()方法不應該被經(jīng)常調用。

• 等待中(Waiting):線(xiàn)程由于等待I/O等外部進(jìn)程的處理結果而處于被阻斷的狀態(tài),調用currObject.wait( )方法會(huì )使得當前線(xiàn)程進(jìn)入等待狀態(tài),直到其它線(xiàn)程調用currObject.notify() 或者currObject.notifyAll() 。

• 睡眠中(Sleeping):重載方法Thread.sleep(milliseconds),Thread.sleep(milliseconds, nanoseconds)可以迫使Java線(xiàn)程進(jìn)入睡眠狀態(tài)(掛起)。

• 由于I/O阻塞(Blocked on I/O):當I/O條件發(fā)生變化時(shí)(例如讀取了幾個(gè)字節的數據)會(huì )遷移到可執行狀態(tài)。

• 由于同步阻塞中(Blocked on synchronization): 當獲取鎖之后會(huì )進(jìn)入執行中狀態(tài)。

Thread.State 枚舉類(lèi)型包含了Java虛擬機支持的全部的線(xiàn)程狀態(tài)類(lèi)型,下面幾點(diǎn)Java的線(xiàn)程宗旨確保了這些線(xiàn)程狀態(tài)成為可能。

• 對象可以被任何線(xiàn)程共享和修改。

• 線(xiàn)程調度器的搶占性特性,使得線(xiàn)程可以隨時(shí)在/不在多核處理之間切換處理器內核,這意味著(zhù)方法可以在執行的過(guò)程中切換狀態(tài)。否則方法中的死循環(huán)將永遠阻塞CPU,并且使得不同線(xiàn)程的其他方法始終得不到執行。

• 為了防止線(xiàn)程安全問(wèn)題,那些脆弱的方法或者代碼塊可以被鎖定。這使得線(xiàn)程可以處于被鎖定或者加鎖請求處理中兩種狀態(tài)。

• 線(xiàn)程在處理I/O資源(如Sockets,文件句柄,數據庫連接等)時(shí)會(huì )進(jìn)入等待狀態(tài),

• 處于I/O讀寫(xiě)中的線(xiàn)程不能被切換,因此他們或者以成功/失敗的結果正常完成處理,或者其它線(xiàn)程關(guān)閉了相應的資源,迫使他進(jìn)入死亡或者完成的狀態(tài)。這也是為什么一個(gè)合理的超時(shí)時(shí)間可以避免線(xiàn)程由于I/O處理而被永遠阻塞,從而導致嚴重的性能問(wèn)題。

• 線(xiàn)程可以進(jìn)入睡眠狀態(tài),以使得其他處于等待狀態(tài)的線(xiàn)程有機會(huì )執行。

問(wèn)題:yield和sleeping有何區別,sleep()和wait()有何區別?

解答:當一個(gè)任務(wù)調用了yield()方法,它將從執行中狀態(tài)轉變?yōu)榭蓤绦。而當一個(gè)任務(wù)調用了sleep(),則將從執行中狀態(tài)轉變?yōu)榈却?睡眠中狀態(tài)。

方法wait(1000)使得當前線(xiàn)程睡眠1秒鐘,但調用notify() 或者notifyAll()會(huì )隨時(shí)喚醒線(xiàn)程。而sleep(1000)則會(huì )導致當前線(xiàn)程休眠1秒鐘。

問(wèn)題:為什么為了線(xiàn)程安全而鎖定一個(gè)方法或者一個(gè)代碼塊稱(chēng)為“同步”而不是“鎖定”或者“被鎖定”

解答:當某個(gè)方法或者代碼塊被聲明為”synchronized”后,保存數據的內存空間(例如堆內存)將保持被同步狀態(tài)。

這意味著(zhù):當一個(gè)線(xiàn)程獲取鎖并且執行到已被聲明為synchronized的方法或者代碼塊時(shí),該線(xiàn)程首先從主堆內存空間中讀取該鎖定對象的所有變 化,以確保其在開(kāi)始執行之前擁有最新的信息。在synchronized部分執行完畢,線(xiàn)程準備釋放鎖的時(shí)候,所有針對被鎖定對象的修改都將為寫(xiě)入主堆內 存中。這樣其他線(xiàn)程在請求鎖的時(shí)候就可以獲取最新的信息。

問(wèn)題:線(xiàn)程如何進(jìn)行的同步處理?你可以列舉出那些同步級別?同步方法和代碼塊如何區別?

解答:在Java語(yǔ)言中,每個(gè)對象都有一個(gè)鎖,一個(gè)線(xiàn)程可以通過(guò)關(guān)鍵字synchronized來(lái)申請獲取某個(gè) 對象的鎖,關(guān)鍵字synchronized可以被用于方法(粗粒度鎖,對性能影響較大)或代碼塊(細粒度鎖)級別。鎖定方法往往不是一個(gè)很好的選擇,取而 代之的我們應該只鎖定那些訪(fǎng)問(wèn)共享資源的代碼塊,因為每一個(gè)對象都有一個(gè)鎖,所以可以通過(guò)創(chuàng )建虛擬對象來(lái)實(shí)現代碼塊級別的同步,方法塊級別的鎖比鎖定整個(gè) 方法更有效。

Java虛擬機靈活的使用鎖和監視器,一個(gè)監視器總體來(lái)說(shuō)就是一個(gè)守衛者,他負責確保只有一個(gè)線(xiàn)程會(huì )在同一時(shí)間執行被同步的代碼。每個(gè)監視器對應一 個(gè)對象的引用,在線(xiàn)程執行代碼塊的第一條指令之前,他必須持有該引用對象的鎖,否則他將無(wú)法執行這段代碼。一旦他獲得鎖,該線(xiàn)程就可以進(jìn)入這段受到保護的 代碼。當線(xiàn)程不論以何種方式退出代碼塊時(shí),他都將釋放關(guān)聯(lián)對象的鎖。對于靜態(tài)方法,需要請求類(lèi)級別的鎖。

【Java多線(xiàn)程常見(jiàn)面試問(wèn)題及解答】相關(guān)文章:

面試常見(jiàn)的問(wèn)題及解答技巧05-31

面試常見(jiàn)問(wèn)題及解答09-22

外企面試常見(jiàn)問(wèn)題及解答11-10

面試中最常見(jiàn)的問(wèn)題及解答12-05

java招聘面試常見(jiàn)問(wèn)題12-10

java面試最常見(jiàn)問(wèn)題03-24

英語(yǔ)面試常見(jiàn)問(wèn)題的解答思路07-26

面試常見(jiàn)問(wèn)題解答03-19

銷(xiāo)售面試常見(jiàn)問(wèn)題解答10-20

常見(jiàn)面試問(wèn)題解答方法11-28

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频