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+编程玩法 的相关资料和源码请移步至公众号:程序员影子

相关推荐
江南一点雨5 分钟前
ChatGPT与最大似然估计
后端
都叫我大帅哥1 小时前
深入浅出 Resilience4j:Java 微服务的“免疫系统”实战指南
java·spring cloud
程序员爱钓鱼1 小时前
Go语言实战案例-判断一个数是否为质数
后端·google·go
程序员爱钓鱼1 小时前
Go语言实战案例-读取本地文本文件内容
后端·google·go
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
Dcs6 小时前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
Wendy14417 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归
拾光拾趣录8 小时前
括号生成算法
前端·算法
fouryears_234178 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)8 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes