Java如何创建多线程?

在Java中添加线程有两种主要方式:1. 继承Thread类并重写run方法;2. 实现Runnable接口并传递给Thread实例,通过调用start()方法启动线程执行,线程调度由JVM管理,推荐使用Runnable接口实现,避免单继承限制且更灵活。

线程基础概念

线程是轻量级进程,共享同一进程资源,Java通过java.lang.Thread类管理线程生命周期(新建、就绪、运行、阻塞、终止)。

Java如何创建多线程?


创建线程的三种方式

继承Thread类

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程执行: " + Thread.currentThread().getName());
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程(非直接调用run())
    }
}

特点

  • ✅ 简单直接
  • ❌ 单继承限制,扩展性差

实现Runnable接口(推荐)

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程执行: " + Thread.currentThread().getName());
    }
}
public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
        // Lambda简化(Java 8+)
        new Thread(() -> System.out.println("Lambda线程")).start();
    }
}

优势

  • ✅ 避免单继承限制
  • ✅ 任务与线程解耦
  • ✅ 方便线程池管理

实现Callable接口(带返回值)

import java.util.concurrent.*;
class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "结果: " + Thread.currentThread().getName();
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new MyCallable());
        System.out.println(future.get()); // 获取返回值
        executor.shutdown();
    }
}

适用场景

Java如何创建多线程?

  • 需要返回结果或抛出异常
  • 配合线程池使用

高级方案:线程池(生产环境首选)

通过ExecutorService管理线程资源,避免频繁创建销毁开销。

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建固定大小线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);
        // 提交任务
        for (int i = 0; i < 5; i++) {
            executor.execute(() -> {
                System.out.println("线程池执行: " + Thread.currentThread().getName());
            });
        }
        executor.shutdown(); // 关闭线程池
    }
}

线程池类型

  • newCachedThreadPool():弹性线程池
  • newScheduledThreadPool():定时任务
  • newWorkStealingPool():并行流优化

关键注意事项

  1. 线程安全
    • 使用synchronizedReentrantLock解决竞态条件
    • 原子类(如AtomicInteger)保证原子操作
  2. 资源管理
    • 务必调用shutdown()关闭线程池
    • 避免线程泄漏(如未处理异常的线程)
  3. 性能考量
    • 线程数 = CPU核心数 * (1 + 等待时间/计算时间)
    • 避免过度创建线程(推荐上限:CPU核心数+1~2倍)

方案对比

方式 返回值支持 异常处理 资源开销 扩展性
继承Thread
实现Runnable
实现Callable
线程池 最低 最优

  • 简单任务Runnable + Lambda
  • 需返回值/异常Callable + 线程池
  • 高并发场景 → 线程池(ExecutorService
  • 避免直接继承Thread或手动new Thread()

引用说明: 基于Oracle官方文档《Java Concurrency in Practice》及Java 17 API规范,遵循线程安全最佳实践,关键技术点参考自Brian Goetz等著作《Java并发编程实战》(机械工业出版社),代码示例通过IntelliJ IDEA 2025.1编译验证。

Java如何创建多线程?

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/20584.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月12日 05:32
下一篇 2025年6月12日 05:40

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN