c++ 线程什么时候run_阿里后端Java面试题:启动线程是start()还是run()?为什么?...
面试官:请问启动线程是start()还是run()方法,能谈谈吗?
应聘者:start()方法
当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。但是这并不意味着线程就会立即运行。只有当cpu分配时间片时,这个线程获得时间片时,才开始执行run()方法。start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体(真正的逻辑)。
继承Thread类的启动方式
public class ThreadTest {public static void main(String[] args) {MyThread t =new MyThread();t.start();}}class MyThread extends Thread{@Override public void run() {System.out.println("Hello World!");}}
实现Runnable接口的启动方式
public class ThreadTest {public static void main(String[] args) {Thread t =new Thread(new MyRunnable());t.start();}}class MyRunnable implements Runnable{@Override public void run() {System.out.println("Hello World!");}}
实际上这两种启动线程的方式原理是一样的。首先都是调用本地方法启动一个线程,其次是在这个线程里执行目标对象的run()方法。那么这个目标对象是什么呢?为了弄明白这个问题,我们来看看Thread类的run()方法的实现:
public void run() {if (target != null) {target.run();}}
当我们采用实现Runnable接口的方式来实现线程的情况下,在调用new Thread(Runnable target)构造器时,将实现Runnable接口的类的实例设置成了线程要执行的主体所属的目标对象target,当线程启动时,这个实例的 run()方法就被执行了。
当我们采用继承Thread的方式实现线程时,线程的这个run()方法被重写了,所以当线程启动时,执行的是这个对象自身的 run()方法。
总结起来:如果我们采用的是继承Thread类的方式,那么这个target就是线程对象自身,如果我们采用的是实现Runnable接口的方式,那么这个target就是实现了Runnable接口的类的实例。
我们再来看一道混迹于各大面试公司笔试的题目:
public class EqualsTest {public static void main(String args[]) {Thread t = new Thread() {public void run() {pong();}};t.run();System.out.print("ping");}static void pong() {System.out.print("pong");}}
这里的标准答案是:pongping
这里直接调用线程的run方法,就相当于调用普通方法一样,由上往下执行,所以最后的结果是pongping。但是如果上面改成t.start()之后,这个结果就不固定了,因为这里有两个线程(其实还有一个守护线程,这里就先忽略),main线程和 t 线程,这两个线程获得cpu的时间就会不固定了,谁先获得CPU执行权,谁就先打印结果,所以最后的结果可能pongping也可能是pingpong。
————END————
写
在
最
后
——————————
当然是↓↓↓
- 点赞
- 转发
- 关注
c++ 线程什么时候run_阿里后端Java面试题:启动线程是start()还是run()?为什么?...相关推荐
- 【双11劲爆干货】阿里高级Java面试题(首发,70道)
转载自 [双11劲爆干货]阿里高级Java面试题(首发,70道,带详细答案) 整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害.下面题目都带超详细的解答,详情见底部. 1.java事件 ...
- 阿里最新Java面试题,摘选最具代表性49题,看了答案也不过如此
本文转载自:阿里最新Java面试题,摘选最具代表性49题,看了答案也不过如此 不想当将军的士兵不是好士兵,不想成为架构师的Java程序员不是好程序员!为什么要成为架构师,为什么要进大厂? 那年十八 母 ...
- 阿里巴巴、阿里云Java面试题、笔试题(含答案)
其他互联网大厂面试题 1:阿里巴巴Java面试题 2:阿里云Java面试题-实习生岗 3:腾讯Java面试题-高级 4:字节跳动Java面试题 5:字节跳动Java面试题-大数据方向 6:百度Java ...
- 分享一套阿里高级Java面试题,要去阿里的先过这些题。
转载自 分享一套阿里高级Java面试题,要去阿里的先过这些题.
- java 阿里线程池_为什么阿里不允许使用 Executors 创建线程池?
你知道为什么阿里不允许Executors去创建线程池吗? 阿里巴巴开发手册关于线程池有这样一条规定: 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方 ...
- Java后端Java面试题总结2021(春招+秋招+社招)
Java常见2021年最新面试题,附答案解析 01. 创建socket通讯的步骤? 02. Java 中 sleep 方法和 wait 方法的区别? 03. 程序计数器(线程私有) 04. 什么是线程 ...
- java 线程工厂_Java并发编程:Java的四种线程池的使用,以及自定义线程工厂
引言 通过前面的文章,我们学习了Executor框架中的核心类ThreadPoolExecutor ,对于线程池的核心调度机制有了一定的了解,并且成功使用ThreadPoolExecutor 创建了线 ...
- java构造函数中启动线程_通过构造器启动线程的实现方式及其缺点记录。
说明:在构造器中启动线程会很有问题,因为另一个任务可能会在构造器结束之前开始执行,导致该任务会访问到处于不稳定状态的对象.这也是优选Executor而不是显示创建Thread对象的原因. 如下俩种实现 ...
- 2020后端Java面试题汇总
总结了一些相关的java面试题,虽然我是比较反感背面试题的,但是还是需要了解一些基础概念的,不然面试真的可能会很尴尬 1 java基础: 1 介绍一下Java中常见的容器2 Iterator 和 Li ...
最新文章
- php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法
- day04--课后练习
- Java学习之String StringBuffer StringBuilder区别
- log4j 新建日志 重启_Java中log4j控制写入日志开关
- openfire 详细介绍一
- Android系统 miui主题6,miui主题工具-miui主题工具最新版v2.6.2 安卓版_永辉资源网
- 人物抠图(Photoshop技巧系列)
- Tableau实战 楼市降温分析(七)现期房销售额及累计增长
- 32款图片处理软件介绍
- 根据区的code获取省市的code代码,下面有切割数字方法
- R shiny 交互式表格
- Linux文件管理 | Liunx 常用命令
- [深度学习之CNN]CNN卷积神经网络LeNet-5
- 亲戚(relative)
- windows7启动出现0xc000014c错误代码解决办法
- 2019年终总结,一朝看尽长安花
- 本酪忻残厮匆谕窒蕉稼砂瞬颈略啪
- python ipo是什么意思呢_python ipo模型是指什么_后端开发
- 第5章【思考与练习2】将数据集划分为训练集与测试集,查看决策树分类器的性能。 将例5-3中的分类器保存到文件中,然后重新加载预测给出的新数据。
- 10个JS精简代码无形装逼集合,最为致命,记得收藏好
热门文章
- JAVA循环与分支语句edu_Java分支结构和循环结构原理与用法详解
- 幅度和幅值有区别吗_克拉克 (Clark) 变换中等幅值 (2/3) 和等功率 (sqrt(2/3)) 变换的公式推导...
- 试论软件工程学科的交叉性_海外大学所有学科梳理(超大工程,建议收藏)-大学下的硕士一二级学科...
- python 打包exe thread报错_pyinstaller 打包exe 遇到的坑
- 360获公安部“优秀技术支持单位”等七项荣誉
- 核心技术靠化缘是要不来的——自己动手写ORM框架
- visio篇章--1
- 第一周 从C走进C++ 008 函数缺省参数
- BOA+CGI+SQLite 随笔
- DDD:实体如何处理外部依赖