Java四种线程创建方式示例代码

 更新时间:2026年01月20日 08:56:09   作者:⑩-  
在Java中创建线程的方法有多种,每种方法都有其独特的适用场景和优缺点,这篇文章主要介绍了Java四种线程创建方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一句话先给你总览(先建立大脑地图)

Java 创建线程 = 两大类 + 四种方式

分类

方式

直接创建线程

① 继承 Thread

② 实现 Runnable

“高级”线程(推荐)

③ 实现 Callable

+ Future

④ 线程池 ExecutorService

一、方式 ①:继承 Thread(最直观,但不推荐)

1.核心思想

线程 = 一个类

任务写在 run()

2.代码(你必须记住这个结构)

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程在执行:" + Thread.currentThread().getName());
    }
}
 
public class Test {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start(); // ❗必须是 start()
    }
}

3.必须牢记的 2 个坑(面试 & 实战必考)

不能调用 run()

t.run(); // 这不是多线程,只是普通方法调用

必须调用

t.start(); // JVM 创建新线程

Java 只能单继承

class A extends Thread extends B // ❌ 不可能

4.什么时候用?

  • 学习
  • Demo
  • 面试讲原理

真实项目基本不用

二、方式 ②:实现 Runnable

1.核心思想(非常重要)

线程(Thread) ≠ 任务(Runnable)

  • Runnable:你要做什么
  • Thread:谁来执行

解耦思想(面试高频)

2.标准写法(必须背)

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程执行:" + Thread.currentThread().getName());
    }
}
 
public class Test {
    public static void main(String[] args) {
        Runnable task = new MyRunnable();
        Thread t = new Thread(task);
        t.start();
    }
}

3.为什么它比继承 Thread 好?

可以继承别的类

多个线程共享同一个任务

符合面向对象设计

4.一个非常关键的共享例子(一定要看)

class TicketTask implements Runnable {
    private int ticket = 100;
 
    public void run() {
        while (ticket > 0) {
            System.out.println(Thread.currentThread().getName()
                + " 卖出第 " + ticket-- + " 张票");
        }
    }
}
 
public static void main(String[] args) {
    TicketTask task = new TicketTask();
    new Thread(task, "窗口1").start();
    new Thread(task, "窗口2").start();
}

同一个 task,被多个线程执行

5.什么时候用?

99% 的普通多线程场景

三、方式 ③:Callable + Future(能返回结果)

1.为什么需要它?

前两种:

  • 不能返回结果
  • 不能抛受检异常

Callable = 带返回值的 Runnable

2.代码(结构一定要搞懂)

import java.util.concurrent.*;
 
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        Thread.sleep(1000);
        return 100;
    }
}
 
public class Test {
    public static void main(String[] args) throws Exception {
        Callable<Integer> task = new MyCallable();
 
        FutureTask<Integer> futureTask = new FutureTask<>(task);
 
        Thread t = new Thread(futureTask);
        t.start();
 
        Integer result = futureTask.get(); // 阻塞等待结果
        System.out.println("结果:" + result);
    }
}

3.关键角色理解(一定要清楚)

作用

Callable<V>

定义任务(有返回值)

FutureTask<V>

任务 + 结果容器

get()

等待线程执行完成

4.什么时候用?

  • 异步计算
  • 并行任务
  • 需要返回结果

四、方式 ④:线程池

1.为什么一定要用线程池?

直接 new Thread 的问题:

  • 线程创建/销毁开销大
  • 不可控
  • 容易 OOM

线程池:

  • 线程复用
  • 统一管理
  • 性能 & 稳定性最好

2.最基础用法(你先会这个)

ExecutorService pool = Executors.newFixedThreadPool(3);
 
pool.execute(() -> {
    System.out.println(Thread.currentThread().getName());
});
 
pool.shutdown();

3.提交 Runnable / Callable

// Runnable
pool.execute(() -> System.out.println("无返回值"));
 
// Callable
Future<Integer> f = pool.submit(() -> 1 + 2);
System.out.println(f.get());

4.真实项目用什么?

线程池 + Runnable / Callable

五、四种方式终极对比(背这个就够)

方式

返回值

继承限制

推荐指数

继承 Thread

Runnable

⭐⭐⭐⭐

Callable

⭐⭐⭐⭐

线程池

⭐⭐⭐⭐⭐

六、面试一句话总结(直接抄)

Java 创建线程有四种方式:继承 Thread、实现 Runnable、实现 Callable 结合 Future、以及使用线程池。
实际开发中推荐使用线程池 + Runnable/Callable,避免直接创建线程。

七、给你 3 道自测题(你能答出来就是真的会了)

❓1

run()start() 有什么区别?

❓2

为什么不推荐继承 Thread?

❓3

线程池解决了什么问题?

总结

到此这篇关于Java四种线程创建方式的文章就介绍到这了,更多相关Java线程创建方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式以虹猫蓝兔的故事讲解适配器模式

    Java设计模式以虹猫蓝兔的故事讲解适配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能
    2022-04-04
  • 详解Java8的groupBy实现集合的分组

    详解Java8的groupBy实现集合的分组

    这篇文章主要介绍了详解Java8的groupBy实现集合的分组,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java并发工具类之CountDownLatch详解

    Java并发工具类之CountDownLatch详解

    这篇文章主要介绍了Java并发工具类之CountDownLatch详解,CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景,需要的朋友可以参考下
    2023-12-12
  • spring security的BCryptPasswordEncoder加密和对密码验证的原理分析

    spring security的BCryptPasswordEncoder加密和对密码验证的原理分析

    文章介绍了加密算法和hash算法的基本概念,以及BCryptPasswordEncoder加密和解密的原理,加密算法是可逆的,需要加盐以保证安全性,BCryptPasswordEncoder通过生成盐值并在加密和解密过程中使用,确保相同的明文每次加密结果不同,从而提高安全性
    2024-11-11
  • Java 实战练习之网上电商项目的实现

    Java 实战练习之网上电商项目的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+vue+Springboot+ssm+mysql+maven+redis实现一个网上电商项目,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • SpringBoot整合Apache Ignite的实现

    SpringBoot整合Apache Ignite的实现

    本文主要介绍了SpringBoot整合Apache Ignite的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • springboot全局异常处理方式@ControllerAdvice和@ExceptionHandler

    springboot全局异常处理方式@ControllerAdvice和@ExceptionHandler

    文章总结了个人在处理全局异常处理时的经验,包括使用`StatusEnum`来定义状态码,旨在为读者提供参考,并鼓励大家支持脚本之家
    2024-11-11
  • java实现文件变化监控的方法(推荐)

    java实现文件变化监控的方法(推荐)

    下面小编就为大家带来一篇java实现文件变化监控的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java中操作Xml使用方法备忘录(Hutool工具类XmlUtil、XStream)

    Java中操作Xml使用方法备忘录(Hutool工具类XmlUtil、XStream)

    这篇文章主要给大家介绍了关于Java中操作Xml使用方法(Hutool工具类XmlUtil、XStream)的相关资料,XMLUtil是一个工具类,主要用于读取XML配置文件并提供相应的操作方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • AOP在SpringBoot项目中的使用场景解读

    AOP在SpringBoot项目中的使用场景解读

    本文介绍如何使用AOP在不同场景下对方法执行前进行逻辑校验,包括对整个包下、特定控制器下以及特定注解修饰的方法进行校验,通过自定义注解和切面实现,展示了AOP的灵活性和强大功能
    2026-01-01

最新评论