首页 > 其他分享 >Runnable 接口是如何“新建”线程的

Runnable 接口是如何“新建”线程的

时间:2024-09-09 16:52:22浏览次数:9  
标签:Runnable run Thread 接口 线程 public

Runnable 接口是 Java 中用于创建线程的基础接口之一,它定义了一个无参无返回的方法 run(),而在我们的认知中,其是创建线程的方法之一,使得对象可以在线程中执行,而无需继承Thread类。

一、Runnable 接口如何“新建”线程

事实上,这个所谓的“新建”只是一个通俗的叫法,就Java而言,代表线程的类只有Thread一种。该类在执行start方法启动线程时,JVM会调用该线程的run方法,我们通过继承Thread类来新建多线程任务时,往往也是重写run方法来实现一部分逻辑,但是,Thread源码中的run方法实际上是这样的:

public void run() {
   if (target != null) {
        target.run();
   }
}

也就是说,使用Runnable 接口“新建”线程,实际上就是调用Thread的构造函数,将实现了Runnable 接口的对象传入,并赋值给target属性,如此一来,JVM调用该线程的run方法,也就调用了实现Runnable接口的对象的run方法。

二、使用Runnable 接口“新建”线程的意义

从逻辑上而言,该方法是为了将线程本身的控制逻辑和业务逻辑的分离,当然,继承Thread也能一定程度上实现这点,但继承Thread类实现多线程存在一个很大的不足,那就是多线程资源的共享。
众所周知,一个Thread对象只能start一次,我们如果想要让多个线程同时运行,就要新建多个Thread对象,那么,如何我们想让这些Thread对象共享同一份资源呢?最简单的方式,我们将资源设为静态变量,但是,这样一来,其生存周期就大大延长,若共享资源很多且需要复杂的逻辑,就更加麻烦。如此一来,我们反而不如将共享资源独立出来,也就是说,向不同的Thread对象传入同一个变量,由此实现资源的共享,如此考虑,就需要保证run方法中可以取到该变量,如果我们不想每次都通过匿名实现类新建传参,最好的实现方式就是将该变量传入作为Thread对象的一个属性,变量已经传入了,我们总不能每次都根据变量的不同重写run方法吧,那样代码逻辑的耦合度也太高了,这么一看,反而不如将run方法的实现也交给该变量来实现。
为了保证该变量能够实现run方法,便提出个接口规范吧:

private Runnable target;//保证符合Runnable接口规范的才能传入

在此情况下,Thread类只需要完成控制逻辑,其它的都托管给“Runnable类”完成。

三、使用举例 -- 作为参数传入到Thread的构造方法

  1. 普通传入
public class Worker implements Runnable {
    @Override
    public void run() {
        // 业务逻辑
        System.out.println("Executing worker task...");
    }
}

public class Main {
    public static void main(String[] args) {
        Runnable worker = new Worker();
        Thread thread = new Thread(worker);
        thread.start();
    }
}
  1. 线程池传入
public class Worker implements Runnable {
    @Override
    public void run() {
        // 业务逻辑
        System.out.println("Executing worker task...");
    }
}

public class Main {
    public static void main(String[] args) {
    	Runnable worker = new Worker();
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 10; i++) {//多个线程执行同一套逻辑,正常情况下需要考虑加锁
            executorService.execute(worker);
        }
        executorService.shutdown();
    }
}

四、总结

通过实现Runnable接口的对象传递共享资源和业务逻辑,实际上实现了的线程控制和业务执行解耦分离,是一种简单而使用高效的实现多线程的方式。

标签:Runnable,run,Thread,接口,线程,public
From: https://www.cnblogs.com/bbban/p/18404855

相关文章

  • 面试官:如何实现线程池任务编排?
    任务编排(TaskOrchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行。1.为什么需要任务编排?在复杂的业务场景中,任务间通常存在依赖关系,也就是某个任务会依赖另一个任务的执行结果,在这种情况下,我们需要通过任务编排,来确保任务按照正确的顺序进行执行。......
  • PLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)__QUERYINTERFACE运算符__QUERYPOINTER是IEC61131-3的扩展,该运算符允许在运行时将一个接口引用转换成另一个接口的引用。返回值BOOL类型:True表示转换成功,Flase表示转换失败。......
  • python中的线程锁的了解与学习
    文章目录前言一、python为什么会有GIL?二、GIL和线程锁有什么联系三、线程安全与锁3.1线程安全3.2Lock(一次放生一个)3.3RLock(一次放生一个)3.4BoundedSemaphore(一次放生定值个)3.5Condition(一次放生任意个,可变化)3.6Event(一次放生所有)四、总结前言       ......
  • python中的线程池的了解与学习
    文章目录前言一、线程池的使用二、线程池的工作流程三、线程池的优势四、总结前言       线程池是计算机编程中用于管理一组预先创建的线程的机制,这些线程可以被复用以执行多个任务。线程池的主要目的是提高程序的效率和响应性,通过减少线程创建和销毁的开销,......
  • 0号线程swapper
    【Linux内核|进程管理】0号线程swapper简介 12人赞同了该文章​目录收起0.说明1.总览2.汇编阶段的初始化3.init_task结构体4.bootcpu0号线程的工作4.1.start_kernel4.2.其他cpu的0号线程创建4.3.......
  • Python3+requests搭建接口自动化测试框架_python3 import requests
    框架理念:使用json文件编写测试用例,建一个脚本循环读取测试用例并执行,然后对比返回的接口和用例中的期望结果。将测试结果写入到一个excel表格中生成测试报告,最后使用发送邮件功能将测试报告发送到指定邮箱。其中对所有公共方法进行封装并放在common公共文件目录下。  ......
  • PLC结构化文本(ST)——接口指针转换运算符(__QUERYPOINTER)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——接口指针转换运算符(__QUERYPOINTER)__QUERYPOINTER运算符__QUERYPOINTER是IEC61131-3的扩展,该运算符允许在运行时将功能块的接口引用转换为指针。返回值BOOL类型:True表示转换成功,Flase表示转换失败。出于......
  • 商城上货过程如何选择API接口提高工作效率至关重要!!
    商城上货过程中选择合适的API接口对于提高工作效率至关重要。以下是一些关键步骤和考虑因素,以帮助商城做出明智的选择:一、明确需求业务需求识别:确定商城需要哪些具体的功能和数据,如商品信息、库存管理、订单处理、支付接口、物流跟踪等。分析商城的业务流程,明确API接口在......
  • C++ 多线程代码性能分析——Oracle Developer Studio工具教程
        最近写项目的时候,为了提升性能,把原来一些单线程的代码改成了并行运行。这里我用到的用于评估性能提升效果的工具是OracleDeveloperStudio,不过刚上手时,发现网上相关的教程和博客较少,有些功能的使用也是摸索着过来的,这一过程可谓是十分痛苦了……如今距离初次接触......
  • 发票真伪识别接口费用-发票真伪查验接口-发票验真示例
    发票信息核验是一个重要的财务和会计过程,涉及到对发票上的信息进行验证,以确保其真实性和准确性。在数字化时代,这一过程企业通常想通过调用发票查验接口的方式实现自动化管理模式。发票查验接口费用不同的服务提供商会有不同的收费标准,例如翔云平台提供的发票验真接口可以免费测试......