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

Java 多線程基礎:sleep() 方法詳解與鎖行為分析

     編輯:Java 相關知識

1. sleep() 方法簡介

sleep() 定義在 Thread.java 中,作用是讓「當前線程」休眠,即從「運行狀態」進入「休眠(阻塞)狀態」。休眠時間至少為指定毫秒數;線程喚醒後轉為「就緒狀態」,等待 CPU 調度。

2. sleep() 基礎示例

// SleepTest.java
class ThreadA extends Thread {
    public ThreadA(String name) { super(name); }
    public synchronized void run() {
        try {
            for (int i = 0; i < 10; i++) {
                System.out.printf("%s: %d\n", this.getName(), i);
                if (i % 4 == 0) Thread.sleep(100); // 每 4 次休眠 100ms
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class SleepTest {
    public static void main(String[] args) {
        ThreadA t1 = new ThreadA("t1");
        t1.start();
    }
}

運行結果

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9

3. sleep() 與 wait() 的關鍵區別:鎖的釋放

兩者都能讓線程進入阻塞狀態,但 wait() 會釋放同步鎖,而 sleep() 不會釋放鎖。

驗證示例:sleep() 不釋放鎖

// SleepLockTest.java
public class SleepLockTest {
    private static Object obj = new Object();
    public static void main(String[] args) {
        ThreadA t1 = new ThreadA("t1");
        ThreadA t2 = new ThreadA("t2");
        t1.start();
        t2.start();
    }
    static class ThreadA extends Thread {
        public ThreadA(String name) { super(name); }
        public void run() {
            synchronized (obj) { // 共享同一把鎖
                try {
                    for (int i = 0; i < 10; i++) {
                        System.out.printf("%s: %d\n", this.getName(), i);
                        if (i % 4 == 0) Thread.sleep(100);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

運行結果

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
t2: 0
t2: 1
t2: 2
t2: 3
t2: 4
t2: 5
t2: 6
t2: 7
t2: 8
t2: 9

結果分析

主線程啟動 t1 和 t2,兩者共享 obj 的同步鎖。t1 運行時雖調用 Thread.sleep(100),但 t2 無法獲取 CPU 執行權,因為 t1 持有鎖未釋放。若註釋掉 synchronized(obj),兩線程則可交替執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved