Java并发编程——线程创建的四种方式

文章目录

  • [1. 继承Thread类](#1. 继承Thread类)
  • [2. 实现Runnable接口](#2. 实现Runnable接口)
  • [3. 匿名内部类](#3. 匿名内部类)
  • [4. lambda表达式](#4. lambda表达式)
  • [5. 实现Callable接口](#5. 实现Callable接口)
  • [6. 使用线程池(ExecutorService)](#6. 使用线程池(ExecutorService))

1. 继承Thread类

示例:

java 复制代码
public class myThread extends Thread {
    public static void main(String[] args) {
        myThread thread = new myThread();
        thread.start();
    }
    @Override
    public void run() {
        System.out.println("这是通过继承Thread类创建的线程:"+Thread.currentThread().getName());
    }
}

输出:

重写的是run()方法,而不是start()方法,但是占用了继承的名额,java中的类是单继承的。

底层也是实现Runable接口,如下图:

2. 实现Runnable接口

java 复制代码
public class myRunnable implements Runnable {
    public static void main(String[] args) {
        Thread thread = new Thread(new myRunnable());
        thread.start();
    }

    public void run() {
        System.out.println("这是通过实现Runnable接口创建的线程:"+Thread.currentThread().getName());
    }
}

总结:实现Runnable接口,实现run()方法,使用依然要用到Thread,这种方式更常用

有时候,我们会直接使用匿名内部类的方式或者Lambda表达式的方式:

3. 匿名内部类

示例:

java 复制代码
public class myThread{
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                System.out.println("这是通过使用匿名内部类创建的线程:"+Thread.currentThread().getName());
            }
        });
        thread.start();
    }
}

输出:

4. lambda表达式

java 复制代码
public class myThread{
    public static void main(String[] args) {
        Thread thread = new Thread(() -> System.out.println("这是通过使用lambda表达式创建的线程:"+Thread.currentThread().getName()));
        thread.start();
    }
}

输出:

5. 实现Callable接口

结合FutureTask

java 复制代码
class MyCallable implements Callable<Integer> {
    public Integer call() {
        System.out.println("Thread is running: " + Thread.currentThread().getName());
        return 42; // 返回值
}
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable callable = new MyCallable();
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        new Thread(futureTask).start(); // 启动线程

        Integer result = futureTask.get(); // 获取返回值
        System.out.println("Result: " + result);
    }
}

输出:

FutureTask 本质上还是继承了Runnable接口

Java中,类和类是单继承的,接口之间是多继承的

6. 使用线程池(ExecutorService)

线程池是一种更高效、更灵活的线程管理方式,可以复用线程,避免频繁创建和销毁线程的开销。

java 复制代码
public class MyThread implements Runnable {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.execute(new MyThread());
    }
    @Override
    public void run() {
        System.out.println("hello guys!");
    }
}

输出:

实现Callable接口或者Runnable接口都可以,由ExecutorService来创建线程。

以上几种方式,底层都是基于Runnable。

相关推荐
caimouse2 小时前
reactos编码规范
c语言·开发语言
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
明夜之约6 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee6 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs6 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司6 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
数智工坊6 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
CryptoPP7 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫7 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
fangdengfu1237 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch