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++;
}}