Java - 主線程:每個 Java 程式的核心

大家好,未來的 Java 開發者!今天,我們將進入一個激動人心的 Java 程式設計世界之旅,專注於一個關鍵概念:主線程。作為你友善的鄰居電腦科學老師,我將引導你透過這個主題,用清晰的分析和大量的例子。所以,拿起你最喜歡的飲料,放鬆一下,我們一起深入探討吧!

Java - Main Thread

了解 Java 中的線程

在我們討論主線程之前,先退後一步,了解什麼是線程。想象線程是工廠中(你的程式)的小工人。每個工人可以獨立地執行任務,但他們都一起工作以創造最終產品。

在 Java 中,線程是程式中最小的執行單位。它就像一個分離的執行路徑,允許你的程式同時做多件事。

什麼是主線程?

現在,讓我們專注於我們的主角:主線程。將主線程想象為工廠的監督者。當你啟動 Java 程式時,這個線程就會開始執行,負責執行你的代碼的主要部分。

這裡有一個有趣的事實:即使你從未在你的 Java 程式中明確創建過線程,你也一直在使用主線程!它就像是你的代碼中的無聲英雄。

主線程的生命週期

主線程遵循一個簡單的生命週期:

  1. 它在程式開始時啟動。
  2. 它執行 main() 方法。
  3. 它在 main() 方法完成或調用 System.exit() 時終止。

讓我們透過一個簡單的例子來看看這是怎麼工作的:

public class MainThreadDemo {
public static void main(String[] args) {
System.out.println("Hello from the Main Thread!");
}
}

當你運行這個程式時,主線程會迅速採取行動,打印消息,然後靜靜地退出。它就像一個忍者——在你注意到之前就進來又出去!

如何控制主線程

現在我們知道了主線程是什麼,讓我們學習如何控制它。Java 提供了一些巧妙的工具來管理我們的主線程。以下是一些最常使用的 方法:

方法 描述
Thread.currentThread() 獲取對當前正在執行的線程的引用
Thread.sleep(long millis) 暫停當前線程的執行指定的毫秒數
Thread.setPriority(int priority) 設置線程的優先級
Thread.getName() 獲取線程的名稱
Thread.setName(String name) 設置線程的名稱

讓我們看看另一個例子中這些是如何工作的:

public class MainThreadControl {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread();

System.out.println("Current thread: " + mainThread.getName());

mainThread.setName("SuperMainThread");
System.out.println("Thread name changed to: " + mainThread.getName());

System.out.println("Thread priority: " + mainThread.getPriority());

try {
System.out.println("Main thread going to sleep for 2 seconds...");
Thread.sleep(2000);
System.out.println("Main thread woke up!");
} catch (InterruptedException e) {
System.out.println("Main thread interrupted!");
}
}
}

在這個例子中,我們做了幾件事:

  1. 我們使用 Thread.currentThread() 獲取主線程的引用。
  2. 我們打印線程的原始名稱。
  3. 我們更改線程的名稱並打印新的名稱。
  4. 我們打印線程的優先級。
  5. 我們使用 Thread.sleep() 使線程睡眠2秒鐘。

當你運行這個程式時,你會看到主線程在行動中,更改它的名稱,報告它的優先級,甚至還能快速小憩一會兒!

主線程和異常處理

主線程的一個重要方面是它如何處理異常。如果主線程中發生未捕獲的異常,它將導致程式終止。讓我們看看這是如何發生的:

public class MainThreadException {
public static void main(String[] args) {
System.out.println("Main Thread starting...");

try {
int result = 10 / 0;  // 這將拋出一個 ArithmeticException
} catch (ArithmeticException e) {
System.out.println("Caught an exception: " + e.getMessage());
}

System.out.println("Main Thread continuing after exception...");
}
}

在這個例子中,我們故意通過嘗試除以零來引發一個 ArithmeticException。然而,我們捕獲了這個異常,這允許我們的主線程繼續執行。如果我們沒有捕獲這個異常,我們的程式將會突然終止。

主線程和其他線程

雖然主線程很重要,但它不是唯一的一個線程。在更複雜的 Java 應用程序中,你可能會創建額外的線程來同時執行任務。主線程可以生成這些子線程並等待它們完成。

以下是一個主線程創建並等待子線程的例子:

public class MainThreadWithChild {
public static void main(String[] args) {
System.out.println("Main Thread starting...");

Thread childThread = new Thread(() -> {
System.out.println("Child Thread: Hello from the child!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Child Thread: Goodbye!");
});

childThread.start();

try {
childThread.join();  // 主線程等待子線程完成
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Main Thread: Child thread has finished. Exiting...");
}
}

在這個例子中,主線程創建了一個子線程,啟動它,然後使用 join() 方法等待它完成。這展示了主線程如何與程序中的其他線程協調工作。

結論

這就是全部了,各位!我們已經探討了 Java 主線程的世界,從它的起源到與其他線程的交互。請記住,主線程就像是你的 Java 程式的骨幹——它始終在那裡,默默地保持著事物的運行。

隨著你繼續 Java 的冒險,你會發現理解主線程以及如何控制它將是無價的。這是你將構建更複雜的多線程應用的基礎。

繼續練習,繼續編碼,最重要的是,繼續享受 Java 的樂趣!誰知道呢?也許有一天你將創建改變世界的下一個大型多線程應用程序。在那之前,編程愉快!

Credits: Image by storyset