【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次幂,因为在初始化的时 ...
随机推荐
- python模块之PIL模块(生成随机验证码图片)
PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...
- html知识代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux which命令
which常用与查看并显示指定命令的绝对路径,使用which命令,还可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令. 1.用法 which [命令] 2.实例 1)查看 ls 命令的绝 ...
- springboot设置返回值的编码
/** * @param params * @return 志诚阿福 来访问 */ @PostMapping(value = "/fromAFu", produces = &quo ...
- CCF 201312-3 最大的矩形[比较简单]
问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...
- (转)Spring整合Jpa
Spring-data-jpa 学习笔记(一) 作者:zeng1994 出处:http://www.cnblogs.com/zeng1994/ Spring家族越来越强大,作为一名javaWeb开发 ...
- Latch free等待事件
Latch free等待事件的三个参数:p1-latch的地址:p2-latch编号:p3-请求次数.从oracle10g起,latchfree不再包含所有的latch等待,有些latch等待可能表现 ...
- windows的cmd命令切换磁盘路径
- MySql—模糊查询
实例: SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下: 1.LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden). 2.LIKE '%in ...
- 卷积网络训练太慢?Yann LeCun:已解决CIFAR-10,目标 ImageNet
原文连接:http://blog.kaggle.com/2014/12/22/convolutional-nets-and-cifar-10-an-interview-with-yan-lecun/ ...