面试官:请问启动线程是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()?为什么?...相关推荐

  1. 【双11劲爆干货】阿里高级Java面试题(首发,70道)

    转载自 [双11劲爆干货]阿里高级Java面试题(首发,70道,带详细答案) 整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害.下面题目都带超详细的解答,详情见底部. 1.java事件 ...

  2. 阿里最新Java面试题,摘选最具代表性49题,看了答案也不过如此

    本文转载自:阿里最新Java面试题,摘选最具代表性49题,看了答案也不过如此 不想当将军的士兵不是好士兵,不想成为架构师的Java程序员不是好程序员!为什么要成为架构师,为什么要进大厂? 那年十八 母 ...

  3. 阿里巴巴、阿里云Java面试题、笔试题(含答案)

    其他互联网大厂面试题 1:阿里巴巴Java面试题 2:阿里云Java面试题-实习生岗 3:腾讯Java面试题-高级 4:字节跳动Java面试题 5:字节跳动Java面试题-大数据方向 6:百度Java ...

  4. 分享一套阿里高级Java面试题,要去阿里的先过这些题。

    转载自 分享一套阿里高级Java面试题,要去阿里的先过这些题.

  5. java 阿里线程池_为什么阿里不允许使用 Executors 创建线程池?

    你知道为什么阿里不允许Executors去创建线程池吗? 阿里巴巴开发手册关于线程池有这样一条规定: 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方 ...

  6. Java后端Java面试题总结2021(春招+秋招+社招)

    Java常见2021年最新面试题,附答案解析 01. 创建socket通讯的步骤? 02. Java 中 sleep 方法和 wait 方法的区别? 03. 程序计数器(线程私有) 04. 什么是线程 ...

  7. java 线程工厂_Java并发编程:Java的四种线程池的使用,以及自定义线程工厂

    引言 通过前面的文章,我们学习了Executor框架中的核心类ThreadPoolExecutor ,对于线程池的核心调度机制有了一定的了解,并且成功使用ThreadPoolExecutor 创建了线 ...

  8. java构造函数中启动线程_通过构造器启动线程的实现方式及其缺点记录。

    说明:在构造器中启动线程会很有问题,因为另一个任务可能会在构造器结束之前开始执行,导致该任务会访问到处于不稳定状态的对象.这也是优选Executor而不是显示创建Thread对象的原因. 如下俩种实现 ...

  9. 2020后端Java面试题汇总

    总结了一些相关的java面试题,虽然我是比较反感背面试题的,但是还是需要了解一些基础概念的,不然面试真的可能会很尴尬 1 java基础: 1 介绍一下Java中常见的容器2 Iterator 和 Li ...

最新文章

  1. php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法
  2. day04--课后练习
  3. Java学习之String StringBuffer StringBuilder区别
  4. log4j 新建日志 重启_Java中log4j控制写入日志开关
  5. openfire 详细介绍一
  6. Android系统 miui主题6,miui主题工具-miui主题工具最新版v2.6.2 安卓版_永辉资源网
  7. 人物抠图(Photoshop技巧系列)
  8. Tableau实战 楼市降温分析(七)现期房销售额及累计增长
  9. 32款图片处理软件介绍
  10. 根据区的code获取省市的code代码,下面有切割数字方法
  11. R shiny 交互式表格
  12. Linux文件管理 | Liunx 常用命令
  13. [深度学习之CNN]CNN卷积神经网络LeNet-5
  14. 亲戚(relative)
  15. windows7启动出现0xc000014c错误代码解决办法
  16. 2019年终总结,一朝看尽长安花
  17. 本酪忻残厮匆谕窒蕉稼砂瞬颈略啪
  18. python ipo是什么意思呢_python ipo模型是指什么_后端开发
  19. 第5章【思考与练习2】将数据集划分为训练集与测试集,查看决策树分类器的性能。 将例5-3中的分类器保存到文件中,然后重新加载预测给出的新数据。
  20. 10个JS精简代码无形装逼集合,最为致命,记得收藏好

热门文章

  1. JAVA循环与分支语句edu_Java分支结构和循环结构原理与用法详解
  2. 幅度和幅值有区别吗_克拉克 (Clark) 变换中等幅值 (2/3) 和等功率 (sqrt(2/3)) 变换的公式推导...
  3. 试论软件工程学科的交叉性_海外大学所有学科梳理(超大工程,建议收藏)-大学下的硕士一二级学科...
  4. python 打包exe thread报错_pyinstaller 打包exe 遇到的坑
  5. 360获公安部“优秀技术支持单位”等七项荣誉
  6. 核心技术靠化缘是要不来的——自己动手写ORM框架
  7. visio篇章--1
  8. 第一周 从C走进C++ 008 函数缺省参数
  9. BOA+CGI+SQLite 随笔
  10. DDD:实体如何处理外部依赖