Java常见的创建线程的方法

方法一:继承 Thread 类

通过继承 Thread 类来创建线程,在子类中重写 run() 方法来定义线程执行的任务。

typescript 复制代码
java
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

方法二:实现 Runnable 接口

通过实现 Runnable 接口来创建线程,可以避免单继承的限制,同时将线程的任务与线程本身分离。

typescript 复制代码
java
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable); // 将实现了 Runnable 接口的对象传入 Thread 的构造函数
        thread.start(); // 启动线程
    }
}

这两种方法都能够成功创建并启动线程,但通常推荐使用实现 Runnable 接口的方式,因为它更灵活,能够更好地支持面向对象设计原则。

方法三:使用匿名类创建线程

typescript 复制代码
java
public class ThreadExample {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread is running");
            }
        });
        thread.start();
    }
}

方法四:使用 Lambda 表达式创建线程

arduino 复制代码
java
public class ThreadExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("Thread is running");
        });
        thread.start();
    }
}

在上述示例中,我们使用匿名类和 Lambda 表达式分别创建了一个线程,这两种方法都能简洁地定义线程执行的任务。使用 Lambda 表达式可以更加简洁地表示线程的运行逻辑,特别适合于只包含单个方法的接口(如 Runnable 接口)。

方法五:使用 Callable 和 Future 接口可以创建并管理线程

使用 Callable 和 Future 接口可以创建并管理线程,并且可以获取线程执行的结果。下面是一个示例说明如何使用 Callable 和 Future 接口来创建和管理线程:

java 复制代码
java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadExample {
    public static void main(String[] args) {
        Callable<Integer> task = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("Thread is running");
                return 42; // 返回一个结果
            }
        };

        FutureTask<Integer> futureTask = new FutureTask<>(task);
        Thread thread = new Thread(futureTask);
        thread.start();

        try {
            int result = futureTask.get(); // 获取线程执行结果
            System.out.println("Thread result: " + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们首先创建了一个 Callable 对象来定义线程执行的任务,然后将其封装在 FutureTask 中。接着,我们创建一个线程对象,将 FutureTask 对象传递给线程,并启动线程。最后,通过调用 futureTask.get() 方法可以获取线程执行的结果。

使用 Callable 和 Future 接口可以更灵活地控制线程的执行和获取线程的返回结果,特别适合需要在多线程任务中获取返回值的情况。

相关推荐
huahailing10249 小时前
Spring 循环依赖终极解决方案:从原理到实战(附避坑指南)
java·后端·spring
Java程序员威哥10 小时前
SpringBoot2.x与3.x自动配置注册差异深度解析:从原理到迁移实战
java·大数据·开发语言·hive·hadoop·spring boot·后端
shejizuopin10 小时前
基于Spring Boot+小程序的非遗科普平台设计与实现(毕业论文)
spring boot·后端·小程序·毕业设计·论文·毕业论文·非遗科普平台设计与实现
Grassto10 小时前
10 Go 是如何下载第三方包的?GOPROXY 与源码解析
后端·golang·go·go module
MX_935911 小时前
以配置非自定义bean来演示bean的实例化方式
java·开发语言·后端
小唐同学爱学习12 小时前
短链接修改之写锁
spring boot·redis·后端·mysql
lanbing12 小时前
在Mac OS系统中安装Go语言环境教程
开发语言·后端·golang
生活很暖很治愈12 小时前
Linux基础指令——【2】
linux·服务器·后端·ubuntu
无心水12 小时前
17、Go协程通关秘籍:主协程等待+多协程顺序执行实战解析
开发语言·前端·后端·算法·golang·go·2025博客之星评选投票