写点什么

2021 金三银四 Android 大厂面试题来袭!高级面试题 + 解析

发布于: 2021 年 05 月 21 日

2021 年 1 月 4 日,我终于结束了这两个月以来收到的最好的一个公司的视频面试,短短 15 分钟,我们双方就再无话题了。我是觉得我不够优秀,配不上这个岗位。面试官可能觉得已经看透我了。


让我回顾一下这稍纵即逝的 15 分钟:


提前 2 分钟,面试官到达视频现场并友好提示我们开始,先做个自我介绍。


我一开始就很紧张,自我介绍说的一塌糊涂,毫无重点。但面试官很友好,一直跟我点头互动,认真听我不知所云的自我介绍。我很愧疚自责:我浪费了人家的时间。


然后面试官问我是否在找新的工作机会。我说是的,我很想要上班,看到大家在字节上班都很开心,我也想成为字节风口上的那头猪,我想跟字节一起起飞----我可能有脱口秀的潜质。


面试官问:工作中哪件事情最让你有成就感?我回答说:我带了两个新员工,并鼓励他们积极提出自己的想法,去努力试错,更愿意通过鼓励去激发,而不是批评------这个能体现我有什么能力吗?我真是服了我自己。


在很多的博客或者书上,说有三种,除了上述的两种以外,还有一种是实现 Callable 接口。但是这种并不是,因为,我们检查 JDK 中 Thread 的源码,看它的注释:


There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be allocated and started.


这里面明确指出,只有两种方式创建一个新线程执行,而且 Thread 类的构造方法里,也没有接受参数类型为 Callable 的方法。所以新启线程的方式只有上述两种。

Thread 和 Runnable 的区别

我们知道 Java 是面向对象的语言,对于线程来说,这是操作系统层面的概念,那么对于线程来说,Thread 和 Runnable 谁才是线程呢?


要注意,Thread 才是 Java 里对线程的唯一抽象,Runnable 只是对任务(业务逻辑)的抽象。Thread 可以接受任意一个 Runnable 的实例并执行。用一个生活中的例子来说明,一个开发部门中有很多的开发人员,每个开发人员都可以开发程序,这样,每个开发人员就是一个个的 Thread,而开发人员接收到的开发任务就是一个个的 Runnable,开发人员是做实际开发工作的,不同的开发人员完全可以接受同一个开发任务。

深入理解 run()和 start()

同时,我们通过 new Thread()其实只是 new 出一个 Thread 的实例,还没有操作系统中真正的线程挂起钩来。只有执行了 start()方法后,才实现了真正意义上的启动线程。


start()方法让一个线程进入就绪队列等待分配 CPU,分到 CPU 后才调用实现的 run()方法,start()方法不能重复调用,如果重复调用会抛出 IllegalThreadStateException 异常。


而 run 方法是业务逻辑实现的地方,本质上和任意一个类的任意一个成员方法并没有任何区别,可以重复执行,也可以被单独调用。

线程的状态

Java 中线程的状态也不是简单的只有运行和死亡,共分为 6 种:


  1. 初始(NEW):新创建了一个线程对象,但还没有调用 start()方法。

  2. 运行(RUNNABLE):Java 线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。


线程对象创建后,其他线程(比如 main 线程)调用了该对象的 start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 CPU 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得 CPU 时间片后变为运行中状态(running)。


  1. 阻塞(BLOCKED):表示线程阻塞于锁。

  2. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

  3. 超时等待(TIMED_WAITING):该状态不同于 WAITING,它可以在指定的时间后自行返回。

  4. 终止(TERMINATED):表示该线程已经执行完毕。


理解了线程的状态才能更好的让我们在并发编程调试程序时,知道线程的工作情况,进而有针对性的检查我们的代码的运行情况,进一步优化我们的代码。

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。



最后文末放上一个福利:GitHub地址


PS:我 GitHub 中有大量高阶 Android 学习视频资料和面试资料包~


欢迎大家一起交流讨论啊~

用户头像

VX公众号:编程进阶路 2020.11.28 加入

还未添加个人简介

评论

发布
暂无评论
2021金三银四Android大厂面试题来袭!高级面试题+解析