JavaRush /Java Blog /Random-TW /第 25 級。有關該級別主題的面試問題的答案
zor07
等級 31
Санкт-Петербург

第 25 級。有關該級別主題的面試問題的答案

在 Random-TW 群組發布
第 25 級。關於第 1 級主題的面試問題的答案
  1. 物件的所有狀態是什麼Thread

    • 新的
    • 可運行
    • 封鎖
    • 等待
    • TIMED_WAITING
    • 終止
  2. 線程進入區塊時可以進入什麼狀態synchronized

    • 可運行
    • 封鎖

    在RUNNABLE中,如果標記的程式碼區塊synchronized沒有被另一個執行緒佔用。否則,我們的線程將收到 BLOCKED 狀態並等待互斥物件被釋放。

  3. 呼叫該方法時執行緒會進入什麼狀態wait()

    呼叫此方法會將執行緒置於 WAITING 狀態。
    該方法只能在已被當前執行緒「鎖定」的互斥物件上的wait()區塊內調用,否則該方法將拋出IllegalMonitorStateException異常。synchronized

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    當一個方法被呼叫時wait(),當前執行緒釋放該物件的鎖定monitor並進入WAITING狀態,等待該方法被monitor.notify()另一個monitor.notifyAll()執行緒呼叫。一旦發生這種情況,線程就會醒來,如果監視器不忙,它將抓住它並繼續工作。
    如果監視器被另一個執行緒佔用,則目前執行緒將進入 BLOCKED 狀態。

  4. 呼叫該方法時執行緒會進入什麼狀態wait(500)

    呼叫此方法會將執行緒置於 TIMED_WAITING 狀態。
    與方法類比wait(),它只能在已被當前執行緒「鎖定(locked)」的互斥物件上的wait(timeout)一個區塊內呼叫。synchronized

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait(500);}

    當呼叫該方法時wait(),當前執行緒釋放該物件的鎖monitor並進入睡眠狀態 500 毫秒。該物件monitor可能被另一個執行緒捕獲。
    500 毫秒後,執行緒將被喚醒,如果monitor它不忙,它將抓住它並繼續工作。
    如果監視器被另一個執行緒佔用,則目前執行緒將進入 BLOCKED 狀態。

    呼叫該方法時執行緒會進入什麼狀態notify()

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    之後 monitor.wait(),執行緒將進入 WAITING 狀態。notify()物件上的另一個執行緒呼叫的方法monitor會將執行緒從 WAITING 狀態移至 RUNNABLE 狀態,除非監視器物件被另一個執行緒捕獲,否則移至 BLOCKED 狀態。

  5. 呼叫該方法時執行緒會進入什麼狀態notifyAll()

    notifyAll()“將留下”所有線程。所有「睡眠」(WAITING)執行緒之一將進入 RUNNABLE 狀態,接管正在使用的物件的監視器並繼續其工作。其餘的將處於 BLOCKED 狀態。一旦第一個「喚醒」執行緒釋放了其他人都在等待的監視器,下一個執行緒就會重複它的命運(任意執行緒將從 BLOCKED 狀態進入 RUNNABLE 狀態)。這將繼續,直到所有「喚醒」執行緒離開 BLOCKED 狀態。

  6. 三個執行緒中的synchronized區塊稱為wait()互斥物件。如果第四個線程調用,這些線程將進入什麼狀態notifyAll()

    其中兩個將進入 BLOCKED 狀態,一個進入 RUNNABLE 狀態

  7. join(500)它與有何不同wait(500)

    儘管 和join(500)會將wait(500)當前執行緒轉移到 TIMED_WAITING 狀態,但它們之間存在顯著差異:
    join(500)在執行緒上調用,wait(500)在該區塊同步的物件上的同步區塊內調用。
    呼叫時,join(500)當前執行緒將等待 500 毫秒,等待join()呼叫其方法的執行緒完成。
    呼叫時,wait(500)當前執行緒將釋放同步物件的鎖定並進入睡眠狀態 500 毫秒。
    500 毫秒後,這兩種情況下線程都將繼續工作。

  8. wait(500)它與有何不同sleep(500)

    sleep(500)在執行緒上調用,wait(500)在同步區塊內同步該區塊的物件上調用。
    呼叫時,sleep(500)當前執行緒將等待 500 毫秒,然後繼續其工作。
    呼叫時,wait(500)當前執行緒將釋放同步物件的鎖定並進入睡眠狀態 500 毫秒。

  9. 呼叫該方法時執行緒會進入什麼狀態yield()

    當一個方法被呼叫時yield(),當前執行緒“跳過它的輪次”,java立即切換到執行下一個執行緒。線程從一個狀態轉到running另一個狀態ready。運轉和就緒狀態是 RUNNABLE 狀態的子狀態。

PS歡迎評論、補充、更正、評論 =)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION