首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線程 sleep() 休眠機制與鎖行為詳解

     編輯:Java 相關知識

sleep() 介紹

Thread.sleep(millis) 讓當前線程從「運行狀態」進入「休眠(阻塞)狀態」,指定時間後自動轉為「就緒狀態」等待調度。睡眠期間不釋放任何鎖。

基本範例

class ThreadA extends Thread {
    @Override public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.printf("%s: %d%n", getName(), i);
                if (i % 4 == 0) Thread.sleep(100); // 睡 100ms
            }
        } catch (InterruptedException e) { e.printStackTrace(); }
    }
}
public class SleepTest {
    public static void main(String[] args) {
        new ThreadA("t1").start();
    }
}

sleep() vs wait()

特性sleep()wait()
所屬類別ThreadObject
釋放鎖否是
喚醒條件時間到 / interrupt()notify() / notifyAll() / interrupt()

sleep() 不釋放鎖實證

public class SleepLockTest {
    private static final Object LOCK = new Object();
    static class ThreadA extends Thread {
        @Override public void run() {
            synchronized (LOCK) {
                try {
                    for (int i = 0; i < 10; i++) {
                        System.out.printf("%s: %d%n", getName(), i);
                        if (i % 4 == 0) Thread.sleep(100);
                    }
                } catch (InterruptedException e) { e.printStackTrace(); }
            }
        }
    }
    public static void main(String[] args) {
        new ThreadA("t1").start();
        new ThreadA("t2").start();
    }
}

結果:t1 連續印完 0~9,t2 才開始,證明睡眠期間 t1 仍持有鎖。

移除 synchronized 後的行為

若註解掉 synchronized (LOCK),兩線程會交替執行,因無鎖爭用,睡眠時 CPU 可調度另一線程。

注意事項

  • sleep() 拋出 InterruptedException 會清除中斷標誌,捕獲後建議重新設置:Thread.currentThread().interrupt()。
  • 不建議用 sleep() 做精確定時,受系統調度影響誤差較大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved