Java 執行緒
Java 執行緒
執行緒允許程式透過同時執行多個任務來更高效地執行。
執行緒可用於在後臺執行復雜的任務,而不會中斷主程式。
建立執行緒
建立執行緒有兩種方式。
可以透過擴充套件 Thread
類並覆蓋其 run()
方法來建立執行緒
擴充套件語法
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
建立執行緒的另一種方式是實現 Runnable
介面
實現語法
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
執行執行緒
如果類擴充套件了 Thread
類,可以透過建立該類的例項並呼叫其 start()
方法來執行執行緒
擴充套件示例
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
如果類實現了 Runnable
介面,可以透過將該類的例項傳遞給 Thread
物件的建構函式,然後呼叫執行緒的 start()
方法來執行執行緒
實現示例
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
“擴充套件”和“實現”執行緒之間的區別
主要區別在於,當一個類擴充套件 Thread 類時,您不能擴充套件任何其他類,但透過實現 Runnable 介面,也可以擴充套件其他類,例如:class MyClass extends OtherClass implements Runnable
。
併發問題
由於執行緒與其他程式部分同時執行,因此無法知道程式碼將以何種順序執行。當執行緒和主程式讀寫相同的變數時,這些值是不可預測的。由此產生的問題稱為併發問題。
示例
一個變數 amount 的值不可預測的程式碼示例
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
為了避免併發問題,最好線上程之間儘可能少地共享屬性。如果需要共享屬性,一種可能的解決方案是在使用執行緒可能更改的任何屬性之前,使用執行緒的 isAlive()
方法檢查執行緒是否已完成執行。
示例
使用 isAlive()
防止併發問題
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}