java如何创建线程呢?
下文笔者讲述java代码中创建线程的方法及示例分享,如下所示
创建线程的方式
方式1: 继承`Thread`类 重新其中的run方法 方式2: 实现`Runnable`接口 并将其作为参数传给`Thread`构造器 方式3: 使用`Callable`和`FutureTask` 与 `Runnable` 不同 `Callable` 支持返回值和抛出异常 方式4: 使用线程池的方式 使用`ExecutorService`线程池管理线程资源 提高性能和可维护性例
class MyThread extends Thread { @Override public void run() { System.out.println("线程运行中:" + Thread.currentThread().getName()); } } //使用 MyThread thread = new MyThread(); thread.start(); // 启动线程 注意: Java是单继承语言 如果类已经继承了其他类 就不能再继承`Thread` //方式2: class MyRunnable implements Runnable { @Override public void run() { System.out.println("线程运行中:" + Thread.currentThread().getName()); } } //使用 Thread thread = new Thread(new MyRunnable(), "MyRunnableThread"); thread.start(); //方式3: 使用`Callable`和`FutureTask` 与`Runnable`不同 `Callable`支持返回值和抛出异常 例: import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; class MyCallable implements Callable<String> { @Override public String call() throws Exception { System.out.println("线程运行中:" + Thread.currentThread().getName()); return "任务完成"; } } //使用 Callable<String> callable = new MyCallable(); FutureTask<String> task = new FutureTask<>(callable); Thread thread = new Thread(task); thread.start(); try { String result = task.get(); // 获取返回结果 System.out.println("线程返回值:" + result); } catch (Exception e) { e.printStackTrace(); } 优点:支持返回值和异常处理。 常用于需要获取线程执行结果的场景。 //方式4:使用线程池(推荐) 使用`ExecutorService`线程池管理线程资源 提高性能和可维护性 例: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // 创建一个固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(2); // 提交任务 executor.submit(() -> { System.out.println("线程运行中:" + Thread.currentThread().getName()); }); // 关闭线程池 executor.shutdown(); //笔者推荐大家使用这种做法 //由于线程池可以复用线程、控制并发数量,适用于高并发场景。
六种常见线程池类型(来自`Executors`工厂类)
线程池类型 | 描述 |
`newFixedThreadPool(int nThreads)` | 固定大小线程池, 适合负载较重的服务器 |
`newCachedThreadPool()` | 缓存线程池,自动回收空闲线程, 适合执行短期异步任务 |
`newSingleThreadExecutor()` | 单线程线程池, 保证任务顺序执行 |
`newScheduledThreadPool(int corePoolSize)` | 支持定时和周期性任务调度的线程池 |
`newWorkStealingPool()`(JDK 8+) | 使用ForkJoinPool 实现的并行线程池 |
`newVirtualThreadPerTaskExecutor()`(JDK 21+) | 每个任务使用虚拟线程(协程), 极高并发 |
各种创建新线程的方式对比
方式 | 是否有返回值 | 是否可复用线程 | 是否推荐使用 |
继承 `Thread` | ❌ | ❌ | ❌(仅学习用) |
实现 `Runnable` | ❌ | ❌ | ✅(基础用法) |
使用 `Callable` + `FutureTask` | ✅ | ❌ | ✅(需返回值时) |
使用线程池(Executor) | ✅/❌(视任务而定) | ✅ | ✅✅(推荐) |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。