• Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?


    Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?

    在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。

    一:无返回值类型的

    1:继承Thread类

    2:实现Runnable接口

    这两种是大家常用的,代码demo就截图吧。

    1:继承Thread类的写法

    定义:一个类型需要extends thread类,然后实现thread类的run方法。

    编辑

    2:实现Runnable接口的写法:

    定义一个类,实现Runable接口,重新run方法。

    New个thread对象,使用有参构造器,参数是runnable的。然后thread.start()

    编辑

    二:带有返回值的

    3:实现Callable<V>接口

    操作步骤:

    一个类实现Callable接口,重新call方法;

    在调用的时候,需要使用FutureTask这个类的有参构造,然后再使用thread的有参构造。

    最后调用task的get方法。

    代码如下:

    编辑

    运行结果:

    编辑

    Callable返回值的源码:

    我们从FutureTask这个类入手,因为返回值就是从FutureTask中获取的。来看看类关系图:

    编辑

    FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Future和Runnable接口。

    编辑
    编辑

    我们看RunnableFuture这个接口的时候,发现只有一个无返回值的run方法。那么,线程返回的数据是哪个类实现的呢?其实就在FutureTask类里面。我们在来看看FuntrueTask这个类:

    编辑

    重新了run方法。最后,有个set result。既然有set方法。在来看看demo中task.get()方法:

    编辑

    Get方法就带有返回值的。

    至此,实现callable接口带有返回值的原因已经找到了。

    4:使用线程池创建线程

    使用线程池创建的线程,可以有返回值,也可以没有返回值。使用Executory这个顶级接口来处理。

    我们先来看看Executor接口的关系。如下图:

    编辑

    其中看到了熟悉的ThreadPoolExecutor和ScheduledThreadPoolExecutor

    4.1:使用Executor创建没有返回值得线程:

    编辑

    说明:这里不带返回值的,其实就是调用了Runnable的run方法。

    4.2:带有返回值的demo

    创建一个类,实现Callable接口。如下图:

    编辑

    通过这个接口,我们知道是有返回值的。

    编辑

    三:总结

    Java中实现线程有4种方式:

    我们最熟悉的不带换回值的两种以及带有返回值的两种。分别是:

    Thread、Runnable和Callable以及线程池

  • 相关阅读:
    nginx syslog 配置
    通过granfana 以及prometheus 比较zulu 、oracle、openjdk 等jvm 运行
    cube.js 新版本试用preosto
    关于redash 自定义可视化以及query runner 开发的几篇文章
    通过redash query results 数据源实现跨数据库的查询
    cube.js 最近版本的一些更新
    zeebe 0.20.0 集群部署试用
    redash oracle 数据源docker 镜像
    使用jmx-exporter&&jmxtrans && nexus jmx 暴露nexus 系统指标信息
    jmxtrans docker-compose 运行
  • 原文地址:https://www.cnblogs.com/kaigejava/p/12462485.html
Copyright © 2020-2023  润新知