1、继承Thread类,新建一个当前类对象,并且运行其start()方法

1 packagecom.xiaostudy.thread;2

3 /**

4 * @desc 第一种开启线程的方式5 *@authorxiaostudy6 *7 */

8 public class Demo1_Thread extendsThread {9

10 public voidrun() {11 for (int i = 0; i < 10; i++) {12 System.out.println(i + " run()...");13 }14 }15

16 public static voidmain(String[] args) {17 Demo1_Thread demo = newDemo1_Thread();18 demo.start();19 for (int i = 0; i < 10; i++) {20 System.out.println(i + " main()...");21 }22 }23

24 }

Demo1_Thread.java

上面这里就是当前类的一个线程和main线程一起运行

2、实现Runnable接口,然后新建当前类对象,接着新建Thread对象时把当前类对象传进去,最后运行Thread对象的start()方法

1 packagecom.xiaostudy.thread;2

3 /**

4 * @desc 第二种开启线程的方式5 *@authorxiaostudy6 *7 */

8 public class Demo2_Thread implementsRunnable {9

10 public voidrun() {11 for (int i = 0; i < 10; i++) {12 System.out.println(i + " run()...");13 }14 }15

16 public static voidmain(String[] args) {17 Demo2_Thread demo = newDemo2_Thread();18 Thread thread = newThread(demo);19 thread.start();20 for (int i = 0; i < 10; i++) {21 System.out.println(i + " main()...");22 }23 }24

25 }

Demo2_Thread.java

分析:

从Thread的有参构造方法进去

当前类传进去,进入到Thread的init()方法

再跟进去

下面截图问题,分开两个,看行号。就把当前类赋值给了Thread的target属性

再回过头来看Thread对象的run()方法,因为当Thread对象的start()方法调用时,是执行Thread对象的run()方法(这里就不深入分析)

这里的target的值就是当前类对象,所以最后还是执行了当前类对象的run()方法

3、实现Callable接口,新建当前类对象,在新建FutureTask类对象时传入当前类对象,接着新建Thread类对象时传入FutureTask类对象,最后运行Thread对象的start()方法

packagecom.xiaostudy.thread;importjava.util.concurrent.Callable;importjava.util.concurrent.FutureTask;/*** @desc 第三种开启线程的方式

*@authorxiaostudy

**/

public class Demo3_Thread implementsCallable {public static voidmain(String[] args) {

Callable callable= newDemo3_Thread();

FutureTask futureTask= newFutureTask(callable);

Thread thread= newThread(futureTask);

thread.start();for (int i = 0; i < 10; i++) {

System.out.println(i+ " main()...");

}

}public Object call() throwsException {for (int i = 0; i < 10; i++) {

System.out.println(i+ " call()...");

}return null;

}

}

Demo3_Thread.java

分析:

同样从Thread的有参构造方法进去

同样也是跟第二种方法一样

那么,就看Runnable接口和FutureTask类的关系。从下面的图看出FutureTask类是Runnable接口的继承接口的实现类。

接着看看FutureTask的有参构造

从下图可以看出,FutureTask的有参构造,把当前类对象传给了FutureTask的callable属性

那么当Thread执行start()方法时,就是执行FutureTask的run()方法,从下面图看到,最后就是执行了当前类的call()方法

java开启一个线程_【jdk源码分析】java多线程开启的三种方式相关推荐

  1. 从原理到实现丨手把手教你写一个线程池丨源码分析丨线程池内部组成及优化

    人人都能学会的线程池 手写完整版 1. 线程池的使用场景 2. 线程池的内部组成 3. 线程池优化 [项目实战]从原理到实现丨手把手教你写一个线程池丨源码分析丨线程池内部组成及优化 内容包括:C/C+ ...

  2. JDK源码分析——Java的SPI机制分析与实战

    重点提示:在我博客中的所有的源码分析的实例,我都将会放到github上,感兴趣的朋友可以下载下来调试运行,我相信还是可以有所收获的.我的目的是让所有读到我博客的朋友都可以了解到有价值的东西,学习到ja ...

  3. 【java】java中的线程池 ThreadPoolExecutor源码分析

    文章目录 1.概述 4.源码 4.1 关键属性 4.2 构造函数 4.4 状态控制 4.5 ThreadLocalMap 4.6 execute方法源码分析 4.7 addWorker方法源码分析 4 ...

  4. java 数组 源码_Java数组转List的三种方式及对比

    来源:https://s.yam.com/6wu6n 前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一.最常见方式(未必最佳 ...

  5. java 包装类方法总结_【源码】java包装类总结

    1.包装类除了Void和Character,其他六个全部都继承自Number.Number是一个抽象类.如下: public abstract class Number implements java ...

  6. Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

    为什么80%的码农都做不了架构师?>>>    这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情.并发课题对于Java来说是一个又重要又难的一大块 ...

  7. 单例设计模式详解+源代码+JDK源码应用——Java设计模式系列学习笔记

    文章目录 一. 基本介绍 二. 单例模式的八种方式 1. 饿汉式(静态常量) 2. 饿汉式(静态代码块) 3. 懒汉式(线程不安全) 4. 懒汉式(线程安全,同步方法) 5. 懒汉式(线程安全,同步代 ...

  8. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  9. 深入源码分析Java线程池的实现原理

    转载自   深入源码分析Java线程池的实现原理 程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对 ...

  10. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

最新文章

  1. python起步输入-第 4 节 小Python 起步
  2. php-fpm 没有启动脚本,php-fpm服务启动脚本
  3. 淘宝 oracle mysql_Oracle 与 MySQL 的区别-阿里云开发者社区
  4. HDU 1856 More is better
  5. 每个产品经理都应该知道的机器学习术语
  6. 有没有词匹配算法_Google Ads 再次扩展了关键字变量匹配
  7. 手动安装Linux网卡驱动程序
  8. 腾讯否认微信测试语音消息进度调节​;监证会同意蚂蚁集团科创板IPO注册;React 17 正式版发布|极客头条
  9. YUM安装部署LAMP环境
  10. 社区论坛小程序源码,功能齐全,简洁漂亮,前端+后端
  11. 计算几何(一) by 邓俊辉老师
  12. python lime_本地可解释模型不可知的解释– LIME in Python
  13. MATLAB的appdesigner背景图片设置
  14. 【Spring】context:component-scan包扫描问题
  15. linux中设置ssh登录时显示的banner
  16. html按键精灵怎么设置,按键精灵如何设置循环?按键精灵设置循环的方法步骤...
  17. 数据分析预测的方法有哪些
  18. 【专知荟萃18】目标跟踪Object Tracking知识资料全集(入门/进阶/论文/综述/视频/专家,附查看)
  19. JPL-DE430星历调用(使用Fortran)
  20. 拼多多,是真相还是谣言,原来是戏言

热门文章

  1. 怎样才算精通Linux
  2. SQL Server - FileTable
  3. 在SAE搭建微信公众账号服务
  4. 分形之希尔伯特-皮亚诺(Hilbert-Peano)曲线
  5. struts2中action之间的一种跳转
  6. css怎么居中字体,用CSS做将如何字体居中?
  7. Echarts图的属性大全,学会绝对可以把Echarts吃的透透的
  8. Python标准库collections中与字典有关的类
  9. php获取时间格式的年份,PHP获取当前时间、时间戳的各种格式写法汇总
  10. C++ list类的模拟实现