我该如何创建一个Java线程?

在JDK8中,不使用线程池的情况下,一般使用Thread类来创建线程,使用Thread类有三种方式来创建线程。

继承Thread类:通过该方式需要集成hread类,Java是单继承的,这种方式会占用继承名额,不够灵活。

实现Runnable接口:该方法没有返回值,可以通过引用变量的方式返回线程中的计算结果

实现Callable接口:该方法可以返回值,不过需要使用FutureTask对Callable实现类再封装一层,Callable实现类不能直接作为Thread构造方法的参数(代码中通过FutureTask.get()方法获取返回结果,这是一个异步阻塞方法,其方法内部有一个for死循环,直到执行任务的线程修改了FutureTask的state,这个这里不再细述)。

下面是示例代码:

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

// 通过实现Runnable接口来创建线程
class Worker01Thread implements Runnable{

    @Override
    public void run() {
        System.out.println("worker01 start work");
    }

}


// 通过继承Thread类来创建线程,其实和Runnable接口挺像的
class Worker02Thread extends Thread{
    @Override
    public void run() {
        System.out.println("worker02 start work");
    }
}

// 通过实现Callable接口来创建线程,其call()方法是有返回值的
class Worker03Thread implements Callable<String>{
    @Override
    public String call() throws Exception {
        return "worker03 start work";
    }
}

public class CreateThreadDemo01 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        Thread t1 = new Thread(new Worker01Thread());
        t1.start();

        Thread t2 = new Thread(new Worker02Thread());
        t2.start();

        // 这里需要将Callable接口的实现类封装成FutureTask,再创建线程
        FutureTask<String> futureTask = new FutureTask<>(new Worker03Thread());
        Thread t3 = new Thread(futureTask);
        t3.start();
        // futureTask.get(),可以获取线程的返回值,如果线程被阻塞住,futureTask.get()方法也会一直阻塞在这里
        System.out.println(futureTask.get());

    }
}

在JDK21中,可以创建虚拟线程,虚拟线程只能通过Runnable接口或者线程池的方式创建,下面是Runnable接口创建虚拟线程的示例:

java 复制代码
class VirtualWorkerThread implements Runnable {
    @Override
    public void run() {
        System.out.println("VirtualWorkerThread start work");
    }
}

public class CreateVirtualThreadDemo01 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = Thread.ofVirtual().start(new VirtualWorkerThread());
        t1.join(); // 不加这一步,主线程提前结束,虚拟线程还没输出结果
    }
}
相关推荐
网安Ruler1 分钟前
第49天:Web开发-JavaEE应用&SpringBoot栈&模版注入&Thymeleaf&Freemarker&Velocity
java·spring boot·后端
奔跑吧邓邓子30 分钟前
【Java实战㉟】Spring Boot与MyBatis:数据库交互的进阶之旅
java·spring boot·实战·mybatis·数据库交互
赛姐在努力.1 小时前
Spring DI详解--依赖注入的三种方式及优缺点分析
java·mysql·spring
IvanCodes1 小时前
六、Docker 核心技术:Dockerfile 指令详解
java·数据库·docker
_oP_i1 小时前
Java 服务接口中解决跨域(CORS,Cross-Origin Resource Sharing)问题
java·开发语言
用户9446814013502 小时前
部分替代Lombok?不可变数据的载体?一篇文章带你了解JDK16正式引用的record类型!
java
用户0332126663672 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java
轮到我狗叫了2 小时前
力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)
java·算法·leetcode
渣哥2 小时前
你遇到过 ConcurrentModificationException 吗?其实很常见
java
lunzi_fly2 小时前
【源码解读之 Mybatis】【基础篇】-- 第1篇:MyBatis 整体架构设计
java·mybatis