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

相关推荐
diemeng11191 分钟前
2024系统编程语言风云变幻:Rust持续领跑,Zig与Ada异军突起
开发语言·前端·后端·rust
Warren985 分钟前
Springboot中分析SQL性能的两种方式
java·spring boot·后端·sql·mysql·intellij-idea
SylviaW0817 分钟前
python-leetcode 37.翻转二叉树
算法·leetcode·职场和发展
h^hh27 分钟前
洛谷 P3405 [USACO16DEC] Cities and States S(详解)c++
开发语言·数据结构·c++·算法·哈希算法
玦尘、27 分钟前
位运算实用技巧与LeetCode实战
算法·leetcode·位操作
重生之我要成为代码大佬33 分钟前
Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和
开发语言·数据结构·python·算法
Distance失落心1 小时前
idea任意版本的安装
java·ide·java-ee·eclipse·intellij-idea
Aphelios3801 小时前
Linux 下 VIM 编辑器学习记录:从基础到进阶(下)
java·linux·学习·编辑器·vim
Best_Me071 小时前
【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示
人工智能·学习·算法·计算机视觉
HBryce241 小时前
缓存-算法
算法·缓存