当前位置: 首页 > news >正文

创建线程的6种方式

1. ​使用 Thread 类和 Lambda 表达式

这是 Java 8 引入的一种简洁的创建线程的方式,适用于实现 Runnable 接口的线程。

new Thread(() -> {
    // 线程执行的代码
}, "线程名称").start();
  • ​**() -> { ... }**:Lambda 表达式,表示 Runnable 接口的 run() 方法。
  • ​**"线程名称"**:线程的名称(可选)。
  • ​**start()**:启动线程。
示例:
new Thread(() -> {
    System.out.println("线程执行中...");
}, "MyThread").start();

2. ​实现 Runnable 接口

这是最常用的创建线程的方式。Runnable 是一个函数式接口,只有一个 run() 方法。

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程执行中...");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable(), "MyThread");
        thread.start();
    }
}
  • 优点:可以避免单继承的限制(因为 Java 不支持多继承)。
  • 缺点:需要显式创建 Runnable 的实现类。

3. ​继承 Thread

通过继承 Thread 类并重写 run() 方法来创建线程。

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程执行中...");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
  • 优点:简单直接。
  • 缺点:由于 Java 不支持多继承,如果继承了 Thread 类,就不能再继承其他类。

4. ​使用 CallableFutureTask

CallableRunnable 类似,但可以返回结果并抛出异常。通常与 FutureTask 结合使用。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "线程执行完成";
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
        Thread thread = new Thread(futureTask, "MyThread");
        thread.start();

        // 获取线程执行结果
        String result = futureTask.get();
        System.out.println(result);
    }
}
  • 优点:可以获取线程的执行结果。
  • 缺点:使用稍复杂。

5. ​使用线程池(ExecutorService)​

通过线程池管理线程,避免频繁创建和销毁线程的开销。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        executor.submit(() -> {
            System.out.println("线程 1 执行中...");
        });

        executor.submit(() -> {
            System.out.println("线程 2 执行中...");
        });

        executor.shutdown();
    }
}
  • 优点:高效管理线程,适合并发任务。
  • 缺点:需要手动管理线程池的生命周期。

6. ​使用 CompletableFuture(Java 8+)​

CompletableFuture 提供了更强大的异步编程能力,可以方便地处理线程执行结果和异常。

import java.util.concurrent.CompletableFuture;

public class Main {
    public static void main(String[] args) {
        CompletableFuture.runAsync(() -> {
            System.out.println("线程执行中...");
        }).join(); // 等待线程执行完成
    }
}
  • 优点:支持链式调用和组合异步任务。
  • 缺点:适用于复杂的异步编程场景。

总结

方式优点缺点适用场景
Thread + Lambda简洁,适合简单任务无法复用线程逻辑简单的异步任务
实现 Runnable避免单继承限制需要显式创建实现类通用的线程实现
继承 Thread简单直接无法继承其他类简单的线程实现
Callable + FutureTask可以获取线程结果使用稍复杂需要返回结果的线程
线程池(ExecutorService高效管理线程,适合并发任务需要手动管理线程池并发任务
CompletableFuture强大的异步编程能力适用于复杂场景,学习曲线较高复杂的异步任务

在实际开发中,推荐优先使用 ​线程池 或 ​CompletableFuture ,因为它们更高效且功能强大。对于简单的任务,可以使用 Thread + Lambda 或 Runnable

相关文章:

  • Windows打开ftp局域网共享
  • 群体智能优化算法-蛾火焰优化算法(Moth-Flame Optimization Algorithm,含Matlab源代码)
  • AI比人脑更强,因为被植入思维模型【20】卡尼曼双系统理论
  • System.out与BufferedWriter
  • Gradle/Maven 本地仓库默认路径迁移 (减少系统磁盘占用)
  • 【AVRCP】AVRCP与BIP互操作性深度解析:封面艺术传输的技术实现
  • 在小米AX6000中添加tailscale monitor
  • LangChain调用自定义工具
  • 【读点论文】What’s Really New with NewSQL?
  • SEO关键词长尾词高效策略
  • redisson 使用与分析
  • C语言入门教程100讲(34)结构体初始化
  • RISC-V: 固件与操作系统引导 | eg OpenSBI | 借助AI注释项目代码
  • Java架构师成长之路
  • llama源码学习·model.py[3]ROPE旋转位置编码(2)旋转角度生成代码
  • vue-cli如何正确关闭prefetch和preload
  • 让S7-1200与DeepSeek联动(转)
  • MCU vs SoC
  • vue3 UnwrapRef 与 unref的区别
  • [极客大挑战 2019]BuyFlag-3.23BUUCTF练习day5(3)
  • 著名心血管病学专家李国庆教授逝世,享年63岁
  • 女子七年后才知银行卡被盗刷18万元,警方抓获其前男友
  • 讲座预告|以危机为视角解读全球治理
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战
  • 巴基斯坦与印度停火延长至18日
  • MSCI中国指数5月调整:新增5只A股、1只港股