1.继承 `Thread` 类
这是最直接的方法之一。你可以创建一个类并让它继承 `java.lang.Thread` 类,并重写它的 `run` 方法。
# 示例代码:
```java
class MyThread extends Thread {
public void run() {
System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动新线程
}
}
```
2.实现 `Runnable` 接口
通常推荐这种方法,因为它使得你的代码更加灵活和可重用。你可以创建一个类并实现实现 `java.lang.Runnable` 接口,并在内部实现 `run` 方法。
# 示例代码:
```java
class MyTask implements Runnable {
public void run() {
System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行");
}
}
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyTask());
thread.start(); // 启动新线程
}
}
```
3.使用 `ExecutorService`
提供了一种更高级的方式来创建和管理线程池。这是一个非常灵活的方法,可以更好地控制并发任务的执行。
# 示例代码:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable task = new MyTask();
executor.execute(task); // 向线程池提交任务
}
executor.shutdown(); // 关闭线程池,等待所有任务完成
}
}
```
使用 `Thread` 类和 `Runnable` 接口的关键区别:
-继承 vs 实现: -资源管理: 总结:
选择哪种方法取决于你的具体需求。如果需要直接控制每个线程的操作,并希望代码更具可重用性,推荐使用实现 `Runnable` 接口的方法。如果需要更精细的控制线程的行为、并发控制和资源管理,可以考虑使用 `ExecutorService`。在大多数情况下,使用 `Runnable` 加上 `ExecutorService` 是一个强大且灵活的选择
相关推荐