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

相关推荐
shuair3 分钟前
tomcat的accept-count、max-connections、max-threads三个参数的含义
java·tomcat
画船听雨眠aa5 分钟前
SSM项目本地Tomcat部署
java·tomcat
极客先躯16 分钟前
高级java每日一道面试题-2025年01月24日-框架篇[SpringMVC篇]-SpringMVC常用的注解有哪些?
java·springmvc·常用的注解
AI技术控17 分钟前
计算机视觉算法实战——驾驶员安全带检测
人工智能·算法·计算机视觉
咕德猫宁丶21 分钟前
Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅
java·spring boot·后端
_板栗_24 分钟前
Java8 - flatMap() 介绍
java·stream
C++小厨神26 分钟前
C#语言的函数实现
开发语言·后端·golang
计算机学姐34 分钟前
基于微信小程序的网上订餐管理系统
java·vue.js·spring boot·mysql·微信小程序·小程序·intellij-idea
博一波35 分钟前
【设计模式-行为型】访问者模式
java·设计模式·访问者模式
计算机-秋大田1 小时前
基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)
java·开发语言·后端·微信·小程序·课程设计