• Thread 和 Runnable 的区别


    创建线程 

    1.通过继承Thread类

    1. public class MyThread extends Thread {
    2. public void run() {
    3. // 线程执行的任务
    4. System.out.println("线程执行任务");
    5. }
    6. public static void main(String[] args) {
    7. MyThread myThread = new MyThread();
    8. myThread.start(); // 启动线程
    9. }
    10. }

    2.通过实现Runnable接口

    1. public class MyRunnable implements Runnable {
    2. public void run() {
    3. // 线程执行的任务
    4. System.out.println("线程执行任务");
    5. }
    6. public static void main(String[] args) {
    7. MyRunnable myRunnable = new MyRunnable();
    8. Thread thread = new Thread(myRunnable);
    9. thread.start(); // 启动线程
    10. }
    11. }

    3.使用Lambda表达式来创建线程:

    1. public class Main {
    2. public static void main(String[] args) {
    3. // 使用Lambda表达式创建线程
    4. Thread thread = new Thread(() -> {
    5. // 线程执行的任务
    6. System.out.println("线程执行任务");
    7. });
    8. thread.start(); // 启动线程
    9. }
    10. }

    Thread 和 Runnable 的区别

    Thread 和 Runnable 接口的区别有四个:
    • Thread 是一个类,Runnable 是接口,因为在 Java 语言里面的继承特性,接口可以支持多继承,而类只能单一继承。所以如果在已经存在继承关系的类里面要实现线程的话,只能实现 Runnable 接口。
    • Runnable 表示一个线程的顶级接口,Thread 类其实是实现了 Runnable 这个接口,我们在使用的时候都需要实现 run 方法。
    • 站在面向对象的思想来说,Runnable 相当于一个任务,而 Thread 才是真正处理的线程,所以我们只需要用 Runnable 去定义一个具体的任务,然后交给 Thread 去处理就可以了,这样达到了松耦合的设计目的。
    • 接口表示一种规范或者标准,而实现类表示对这个规范或者标准的实现,所以站在线程的角度来说,Thread 才是真正意义上的线程实现。Runnable 表示线程要执行的任务,因此在线程池里面,提交一个任务传递的类型是Runnable。
    所以,基于这四个点的原因,所以在实际应用中,建议实现 Runnable 接口实现线程的任务定义,然后使用 Thread 的 start 方法去启动启动线程并执行 Runnable 这个任务。
    1. public class MyRunnable implements Runnable {
    2. @Override
    3. public void run() {
    4. // 定义具体的任务逻辑
    5. System.out.println("Executing my task...");
    6. }
    7. }
    8. public class Main {
    9. public static void main(String[] args) {
    10. // 创建Runnable实例
    11. Runnable myRunnable = new MyRunnable();
    12. // 创建Thread实例并将任务分配给线程
    13. Thread thread = new Thread(myRunnable);
    14. // 启动线程
    15. thread.start();
    16. }
    17. }

    Thread 类中的start() run() 方法区别

    start() 方法

    • 当调用 start() 方法时,会通知 "线程规划器" 线程已经准备就绪,可以随时被执行。
    • 实际上,start() 方法会启动一个新的线程,并在新线程中执行 run() 方法。
    • 由 JVM 负责调用 run() 方法,因此 start() 方法之后的代码会立即向下执行,而不会等待新线程的执行结果。
    1. Thread thread = new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. System.out.println("\"qd0\" = " + "qd0");
    5. }
    6. });
    7. thread.start();

    run() 方法

    • run() 方法定义了线程的执行逻辑,是实际线程要执行的代码块。
    • 直接调用 run() 方法,并不会创建新线程,而是在当前线程中执行 run() 方法的内容。
    • 如果直接调用 run() 方法,那么 run() 方法会在当前线程中同步执行,而不会启动新线程。
    1. Thread thread = new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. System.out.println("\"qd0\" = " + "qd0");
    5. }
    6. });
    7. thread.run();

    总结来说,start() 方法用于启动一个新的线程,并由 JVM 调用新线程的 run() 方法;而 run() 方法则是线程的实际执行体,如果直接调用该方法,将在当前线程中同步执行,不会启动新线程。

  • 相关阅读:
    深入浅出Java多线程(八):volatile
    基于树莓派的蓄电池控制系统
    宝塔等Nginx环境添加允许跨域Header头
    “程序员,致敬!”
    透明质酸改性乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)纳米粒HA-PA1b
    PaddleOCR学习笔记3-通用识别服务
    SCAN BASIC --- PARTII scan test
    【重识云原生】第六章容器6.1.8节——Docker核心技术UnionFS
    树莓派4B基于OpenCV的C++环境的串口通信
    基于JAVA人才库构建研究计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/134092226