这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析。

通过三种方法可以创建java线程:

1、继承Thread类。

2、实现Runnable接口。

3、实现Callable接口,并通过FutureTask的实例注入到Thread的target中。

创建java线程首要的目的是通过新创建的线程执行自己的代码逻辑,就是实现重载run方法。

所以我们无论是继承Thread类还是实现Runnable接口,要做的就是重载run方法,实现自己的代码逻辑。

接下来是运行:无论使用哪种方法实现自定义线程,我们都要创建线程实例(继承Thread类的方式是通过派生类对象的创建,从而创建父类对象)。然后通过执行Thread实例的Start方法,将该实例加入到ThreadGroup中,然后通过native方法start0运行该Thread实例。

经过一系列运行状态的检测(具体干了啥,都在native方法中),最终调用Thread实例的run方法(实现Runnable接口)或者调用Thread派生类实例的run方法(继承Thread类)。

实现Runnable和继承Thread的区别在于继承Thread类的线程类不能再继承其他父类(Java单继承决定)。当然有的博文表示实现Runnable接口的方式可以使Runnable实现类的代码被多个Thread共享,其实只是将Runnale的实现类的实例注入到了多个Thread的target字段中,这些Thread实例操作的是同一个Runnable接口的实现类实例。这当然可以实现共享,但Runnable的子类如Thread都可以被注入到Thread类的target中。

使用Runnable实现run方法在设计模式上更加符合面向对象组合的要求。

还有一种方式是使用Callable<T>接口,这种方式实质上和Runnable是一致的。使用Callable<T>能够使线程返回类型为T的值。

主要方法是:

  FutureTask<Integer> futureTask = new FutureTask<Integer>((Callable<Integer>)()->{ System.out.println("callable create thread"); return 5; } )

  new Thread().start();

然后通过使用FutureTask类的get方法获取返回值,该方法会阻塞直到线程退出。FutureTask继承了Future<T>和Runnable接口,所以能够被注入到target中。

线程执行后,调用FutureTask实例的run方法,该方法中调用callable的call方法,因此,Callable中的call方法可以存放自定义线程代码逻辑的实现。

call方法的返回值被存放在outcome属性中。然后通过FutureTask的get方法获取。

转载于:https://www.cnblogs.com/xiangleili/p/8834802.html

Java创建线程的三种方法相关推荐

  1. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  2. java 创建线程的三种方法_java 创建线程的几种方式

    说道线程,肯定会想到使用 java.lang.Thread.java这个类 那么创建线程也主要有2种方式 第一种方式: public class MyThread extends Thread { p ...

  3. Java 创建线程的三种方式

    一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...

  4. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  5. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  6. java创建线程的两种方法区别

    在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口. 下面通过两个例子来分析两者的区别: 1)继承Thread类 public class TestThread exte ...

  7. java创建线程的四种方法

    第一种:  通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runna ...

  8. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...

  9. java线程三种方法,Java基础_线程的使用及创建线程的三种方法

    线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...

最新文章

  1. python下使用epoll
  2. Python 进度条 tqdm
  3. python线程检测网段脚本!
  4. CASE_04 基于FPGA的电梯控制器
  5. java assembly 打包_maven 使用assembly 进行打包的方法
  6. 匈牙利算法——最大匹配问题详解
  7. 社区论坛小程序带订阅功能
  8. 特殊字符的html编码转化
  9. html5 web报表工具,Web报表工具的填报功能
  10. 微弱信号检测_移动电话/手机信号增强器/扩大器
  11. cad计算机快捷键命令大全,2016cad快捷键命令大全,AutoCAD快捷键命令大全
  12. 移动端1px边框实现
  13. 地铁WIFI值28亿?运营商终于不用背锅了
  14. 人类一败涂地做图教程_人类一败涂地皮肤怎么弄 人类一败涂地皮肤制作教程...
  15. Another app is currently holding the yum lock解决方法
  16. ssm+Vue计算机毕业设计在线答题系统(程序+LW文档)
  17. 查看CUDA,GPU对应计算能力
  18. 81章 老子1章到_老子1章2章80章81章
  19. 前世今生的痴,问谁可以洞悉
  20. 对标 Amazon Go,这家初创企业盯上了国内无人商店市场

热门文章

  1. java方法不写访问权限_【JAVA小白】 问关于访问权限的问题,写接口遇到错误
  2. oracle修改seq为order,Oracle 创建和修改sequence
  3. android webdav 播放器,Android WebDAV
  4. scalar2color
  5. MATLAB中三维曲面命令
  6. TensorFlow 2.0深度学习案例实战
  7. 最新发布!《统计学习方法》第二版无监督学习视频课上线了!
  8. 10代i5主频为什么这么低_i5-10210U 笔记本推荐
  9. android 自定义 黑点,Android自定义密码样式 黑点转换成特殊字符
  10. 无线网卡没有linux驱动,ubuntu18.04没有无线网卡驱动怎么办?