Java | 线程的三种创建和启动方式

大家好,我是程序员影子

一名致力于帮助更多朋友快速入门编程的程序猿

今天来聊一聊关于Java 中的线程的三种创建和启动方式

一、通过继承 Thread

这是最直接的方式,通过创建一个新的类,继承自Thread类,并重写run()方法。然后创建该类的实例,并调用start()方法来启动线程。

csharp 复制代码
class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("MyThread: " + i);
        }
    }
}
public class CreateThreadByExtendingExample {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start(); // 启动线程
    }
}

二、通过实现 Runnable接口

这是推荐的方式,通过创建一个新的类,实现Runnable接口,并实现run()方法。然后将该类的实例传递给Thread对象,并调用start()方法来启动线程。

typescript 复制代码
class MyRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("MyRunnable: " + i);
        }
    }
}
public class CreateRunnableExample {
    public static void main(String[] args) {
        Thread t2 = new Thread(new MyRunnable());
        t2.start(); // 启动线程
    }
}

三、通过 Executor框架和 Callable接口

  • Callable接口与Runnable类似,但它有一个call()方法,该方法在执行线程任务时可以返回结果或抛出异常。
  • Executor框架是Java 5引入的,用于管理线程池。它允许你提交RunnableCallable任务,而不需要直接管理线程。
java 复制代码
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class MyCallable implements Callable<Integer> {
    public Integer call() {
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += i;
        }
        return sum;
    }
}
public class CallableExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        Future<Integer> future = executor.submit(new MyCallable());
        try {
            Integer result = future.get(); // 获取异步执行的结果
            System.out.println("异步计算结果:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        executor.shutdown(); // 关闭线程池
    }
}

在这个例子中,我们创建了一个Callable任务,它计算1到10的整数和。然后我们使用ExecutorServicesubmit()方法来提交这个任务,并获取一个Future对象。通过Future对象的get()方法,我们可以等待任务完成并获取结果。

以上三种方式都可以创建和启动线程,但实现Runnable接口的方式更为灵活,并且Executor框架提供了更高级的线程管理功能,可以更好地控制线程池的大小和管理线程的生命周期。

以上就是本次分享的所有内容,感兴趣的朋友点个关注呀,感谢大家啦~

更多Java | AI+编程玩法 的相关资料和源码请移步至公众号:程序员影子

相关推荐
Alan_69118 小时前
商品详情优化三板斧-拆分-多级缓存-GC调参
后端·缓存
Conan在掘金18 小时前
ArkTS 进阶之道(3):为哈禁解构声明?类型一眼可见 vs 推断链断裂
后端
心念枕惊18 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
晚安code18 小时前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
feng尘18 小时前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试
大陈AI18 小时前
Docker Compose 前后端部署踩坑实录:3 个坑让我的容器反复 Exit(1)
后端
长大198818 小时前
MySQL 慢查询排查完整流程
后端
KaMeidebaby19 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法
苏三说技术19 小时前
为什么越来越多人使用FastAPI?
后端
老孙讲技术19 小时前
业主半夜想看楼道监控,物业却说「去机房」?我用设备托管+轻应用,把小区摄像头嵌进了社区小程序
后端·物联网