🌈键盘敲烂,年薪30万🌈
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()); } } }