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

Java 線程控制核心方法詳解:isAlive、currentThread、interrupt、stop、join

     編輯:Java 綜合教學

Java 線程控制遠不止 start()、run()、sleep()。掌握 isAlive()、currentThread()、interrupt()、stop()、join() 等核心方法,才能精準掌控線程生命週期與協作關係。

關鍵方法解析

1. isAlive() —— 判斷線程是否存活

線程從 start() 啟動到正常終止或異常結束前,皆處於「存活」狀態,返回 true;新建或已死亡則返回 false。常用於監控線程池或協調邏輯中。

2. currentThread() —— 獲取當前執行線程

屬於 Thread 類方法,返回正在佔用 CPU 的線程引用。典型用法:if (Thread.currentThread() == targetThread) ... 以區分不同線程執行邏輯。

3. interrupt() —— 中斷休眠/等待線程

當線程因 sleep()、wait()、join() 等進入阻塞,調用 interrupt() 會拋出 InterruptedException,使線程提前醒來並進入就緒隊列。注意:不會強制終止線程,需自行捕獲異常處理後續邏輯。

4. stop()(已棄用) —— 強制終止線程

直接殺死線程,釋放所有鎖,極易導致數據不一致、死鎖等嚴重問題,生產環境嚴禁使用,僅供理解歷史 API。

5. join() —— 線程合併/等待

調用線程(如主線程)調用 targetThread.join() 後阻塞,直到目標線程執行完畢。常用於「主線程等待子任務完成」場景。

代碼示例:師生互動模擬 interrupt

class Classroom implements Runnable {
    Thread student, teacher;
    Classroom() {
        teacher = new Thread(this, "王教授");
        student = new Thread(this, "張三");
    }
    public void run() {
        if (Thread.currentThread() == student) {
            try {
                System.out.println(student.getName() + " 正在睡覺,不聽課");
                Thread.sleep(1000 * 60 * 60); // 睡 1 小時
            } catch (InterruptedException e) {
                System.out.println(student.getName() + " 被老師叫醒了");
            }
        } else if (Thread.currentThread() == teacher) {
            for (int i = 1; i <= 3; i++) System.out.println("上課!");
            try { Thread.sleep(500); } catch (InterruptedException e) {}
            student.interrupt(); // 喚醒學生
        }
    }
}
public class InterruptDemo {
    public static void main(String[] args) {
        Classroom c = new Classroom();
        c.student.start();
        c.teacher.start();
    }
}

代碼示例:顧客等待電視生產(join)

class TV { float price; String name; TV(String n, float p) { name=n; price=p; } }
class Factory implements Runnable {
    TV tv; Thread customer, maker;
    Factory() { customer=new Thread(this,"顧客"); maker=new Thread(this,"製造商"); }
    public void run() {
        if (Thread.currentThread() == customer) {
            System.out.println(customer.getName()+" 等 "+maker.getName()+" 生產電視");
            try { maker.join(); } catch (InterruptedException e) {}
            System.out.println(customer.getName()+" 買到 "+tv.name+" 價格:"+tv.price);
        } else {
            System.out.println(maker.getName()+" 開始生產...");
            try { Thread.sleep(2000); } catch (InterruptedException e) {}
            tv = new TV("長虹牌", 4500);
            System.out.println(maker.getName()+" 生產完畢!");
        }
    }
}
public class JoinDemo {
    public static void main(String[] args) {
        Factory f = new Factory();
        f.customer.start(); f.maker.start();
    }
}

最佳實踐建議

  • 優先使用 interrupt() + 異常處理實現優雅停止,避免 stop()。
  • join() 可加超時參數 join(millis) 防止無限等待。
  • 結合 isAlive() 做線程狀態監控與決策。
  • 多線程協作推薦使用更高層級的 CountDownLatch、CyclicBarrier、CompletableFuture 等工具類。

深入理解這些底層控制方法,是編寫健壯並發程序的基石。

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