🌈键盘敲烂,年薪30万🌈
线程的四种实现方式:
1. 继承Thread类
2. 实现Runnable接口
3. 实现Collable接口
4. 线程池获取线程
1. 继承Thread类
💧优点:
- 简单易懂,适用于简单的线程需求。
- 直接继承Thread类,方便编写和理解。
💧缺点:
- 由于Java是单继承的,如果已经继承了其他类,就无法再通过继承Thread类来创建线程。
注意:Thread是Runnable接口的一个实现类,相当于java为我们封装好的一个简单线程类
👀代码实现:
class MyThread extends Thread {
public void run() {
// 线程执行逻辑
}
}
// 创建并启动线程
MyThread myThread = new MyThread();
myThread.start();
2. 实现Runnable接口
💧优点:
- 避免了单继承的限制,一个类可以实现多个接口。
- 更灵活,适用于多个线程共享一个任务的情况。
💧缺点:
- 代码相对繁琐一些。
👀代码实现:
class MyRunnable implements Runnable {
public void run() {
// 线程执行逻辑
}
}
// 创建并启动线程
Thread myThread = new Thread(new MyRunnable());
myThread.start();
3. 实现Collable接口
💧优点:
- 可以获取线程执行的结果,并且可以抛出异常。
💧缺点:
- 相对于Runnable,写法略显复杂。
👀代码实现:
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int total = 0;
for (int i = 0; i <= 100; i++) {
total += i;
}
return total;
}
}
//创建线程任务
MyCallable myCallable = new MyCallable();
//管理结果
FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(myCallable);
//创建线程
Thread thread = new Thread(integerFutureTask);
thread.start();
Integer ans = integerFutureTask.get();
System.out.println(ans);
4. 线程池获取线程
创建线程池 - 提交任务 - 销毁线程池
💧优点:
- 线程池中的线程可以被重复利用,减少了线程的创建和销毁的开销。
👀代码实现:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池,大小为3
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 提交任务给线程池执行
for (int i = 0; i < 5; i++) {
Runnable task = new MyTask(i);
executorService.submit(task);
}
// 关闭线程池
executorService.shutdown();
}
static class MyTask implements Runnable {
private int taskId;
public MyTask(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task ID : " + taskId + " is running on thread " + Thread.currentThread().getName());
}
}
}