【jdk源码分析】java多线程开启的三种方式
1、继承Thread类,新建一个当前类对象,并且运行其start()方法
package com.xiaostudy.thread; /**
* @desc 第一种开启线程的方式
* @author xiaostudy
*
*/
public class Demo1_Thread extends Thread { public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " run()...");
}
} public static void main(String[] args) {
Demo1_Thread demo = new Demo1_Thread();
demo.start();
for (int i = 0; i < 10; i++) {
System.out.println(i + " main()...");
}
} }
Demo1_Thread.java

上面这里就是当前类的一个线程和main线程一起运行
2、实现Runnable接口,然后新建当前类对象,接着新建Thread对象时把当前类对象传进去,最后运行Thread对象的start()方法
package com.xiaostudy.thread; /**
* @desc 第二种开启线程的方式
* @author xiaostudy
*
*/
public class Demo2_Thread implements Runnable { public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " run()...");
}
} public static void main(String[] args) {
Demo2_Thread demo = new Demo2_Thread();
Thread thread = new Thread(demo);
thread.start();
for (int i = 0; i < 10; i++) {
System.out.println(i + " main()...");
}
} }
Demo2_Thread.java

分析:
从Thread的有参构造方法进去

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

再跟进去

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


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

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

3、实现Callable接口,新建当前类对象,在新建FutureTask类对象时传入当前类对象,接着新建Thread类对象时传入FutureTask类对象,最后运行Thread对象的start()方法
package com.xiaostudy.thread; import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; /**
* @desc 第三种开启线程的方式
* @author xiaostudy
*
*/
public class Demo3_Thread implements Callable { public static void main(String[] args) {
Callable callable = new Demo3_Thread();
FutureTask futureTask = new FutureTask(callable);
Thread thread = new Thread(futureTask);
thread.start();
for (int i = 0; i < 10; i++) {
System.out.println(i + " main()...");
}
} public Object call() throws Exception {
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()方法


【jdk源码分析】java多线程开启的三种方式的更多相关文章
- 如何实现有返回值的多线程 JAVA多线程实现的三种方式
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...
- JDK源码分析之concurrent包(三) -- Future方式的实现
上一篇我们基于JDK的源码对线程池ThreadPoolExecutor的实现做了分析,本篇来对Executor框架中另一种典型用法Future方式做源码解读.我们知道Future方式实现了带有返回值的 ...
- JAVA多线程实现的三种方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- AJPFX关于JAVA多线程实现的三种方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- jdk源码分析——java.lang.Boolean
1.Boolean类里面的2个静态变量. Boolean类,直接声明了2个静态变量,TRUE 和 FALSE,指向2个对象. public static final Boolean TRU ...
- JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue
JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlocki ...
- JDK源码分析(2)LinkedList
JDK版本 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 ...
- 【JDK】JDK源码分析-ArrayList
概述 ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」. 我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变. ...
- JDK 源码分析(4)—— HashMap/LinkedHashMap/Hashtable
JDK 源码分析(4)-- HashMap/LinkedHashMap/Hashtable HashMap HashMap采用的是哈希算法+链表冲突解决,table的大小永远为2次幂,因为在初始化的时 ...
随机推荐
- Linux常用软件(以及特殊命令)清单(ubuntu)
LibreOffice 解压缩命令 unar .tar 创建新文档命令:touch.vi/vim 浏览器:google chrome.firefox
- 系统架构--分布式计算系统spark学习(三)
通过搭建和运行example,我们初步认识了spark. 大概是这么一个流程 ------------------------------ -------------- ...
- mysql数据池设置
参考链接https://www.cnblogs.com/KKSoft/p/8040374.html python的数据库连接池包:DBUtils DBUtils提供两种外部接口: Persistent ...
- Python 调用 Shell脚本的方法
Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...
- spring MVC学习(二)---配置相关的东西
1.在上一节中我们提到过每一个DispatcherServlet都会有一个上下文 (WebApplictionContext),并且继承了这些上下文中的bean,其中以一些"特殊" ...
- Font Awesome-用CSS实现各种小图标icon
Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果.官网:http://fontawesome.dashga ...
- PHP 基础篇 - PHP 中 DES 加解密详解
一.简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对 ...
- flyweight模式
参考资料 • 维基百科:https://en.wikipedia.org/wiki/Flyweight_pattern • 百度百科:http://baike.baidu.com/link?url=R ...
- python全栈开发从入门到放弃之递归函数的调用
1.递归效率低,需要在进入下一次递归时保留当前的状态,见51cto博客 解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自动但是python又没有尾递归,且对递归层级做了限制 必须有一个明确的 ...
- 3.MySQL必知必会之检索数据-SELECT语句
本章将介绍如何使用SELECT语句从表中检索一个或多个数据列. 1.SELECT语句 SQL语句是由简单的英语单词构成的.这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的.大概,最经常使 ...