run() vs start()run() 只是普通方法調用,不會開啟新線程;必須調用 start() 才會由 JVM 安排線程並發執行。run() 必須為 public void、無參數,這是實現 Runnable 介面的契約。
synchronized 與鎖機制synchronized 保護的是共享數據。核心原理:每個對象有一把內部鎖。線程進入同步代碼塊/方法前必須獲取鎖,退出時釋放鎖。
this 對象Class 對象synchronized(obj) { ... },鎖住指定對象,建議縮小鎖範圍以提高併發度兩個不同 Runnable 實例啟動的線程,即使 run() 加了 synchronized,也無法同步,因為鎖的是不同對象。只有共享同一個Runnable 實例的線程才能互斥執行。
sleep()InterruptedException,需捕獲處理join()調用 t.join() 會阻塞當前線程,直到線程 t 結束。常用於主線程等待子線程完成後再繼續。
yield()wait() / notify() / notifyAll()這三個方法屬於 Object 類,**必須在同步塊/方法中調用**。
wait():釋放鎖,進入對象的等待集notify():喚醒等待集中任意一個線程,移至鎖池notifyAll():喚醒等待集中所有線程synchronized(lock) {
while (queue.isEmpty()) lock.wait(); // 條件不滿足則等待
// 消費數據
lock.notifyAll(); // 通知生產者
}
Java 線程生命週期:NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED。
yield() 協作Runnable 介面,而非繼承 Thread 類wait/notify 時必須用 while 循環檢查條件,防止虛假喚醒stop()、suspend()、resume(),請用中斷標誌位