Java面试题之为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
目录
回到问题
总结
线程简介
线程基本分为五种状态
- new新建状态
- Runnable运行状态
- Blocked阻塞状态
- Waiting等待状态
- Terminated终止状态
多线程的工作方式
多线程是一种并发编程的方式,它允许程序同时执行多个线程。每个线程都有自己的执行路径,可以独立地执行代码。
多线程的工作方式为:
1. 创建一个或多个线程,每个线程都有自己的执行路径。
2. 在每个线程中执行代码,这些代码可以是不同的,也可以是相同的。
3. 线程之间可以共享内存和资源,也可以通过消息传递等方式进行通信。
4. 线程的执行顺序是不确定的,取决于操作系统的调度策略和线程优先级等因素。
5. 多线程可以提高程序的效率和响应性,但也会增加程序的复杂性和难度。
回到问题
首先new 一个Thread,线程进入了新建状态,调用start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到 时间片 后就可以开始运行了。start() 会执行线程的相应准备工作,然后自动执行run() 方法的内容,这是真正的多线程工作。
而直接执行run()方法会把run()方法当作main线程下单一个普通方法去去执行,并不会在某个线程中执行,所以者并不是多线程工作
1.用start()来执行
结果:
在各种的线程中执行,争抢执行权,共享数据。
2.用run()来执行
结果
只在主线程中执行,且只有一个主线程
总结
调用start()方法可以启动线程并使线程进入就绪状态,而run()方法只是thread的普通方法调用,还是在主线程中执行的
CSDN-Ada助手: 恭喜您写下了第14篇博客!标题“Redis持久化”引人入胜,真是令人期待的专题。您对Redis持久化的深入探讨无疑会对读者有着重要的启发。您的博客一直以来都能给读者带来新的见解和理解,真是令人佩服。 鉴于您在Redis方面的专业知识,我想提供一个下一步的创作建议。或许您可以考虑探讨如何在实际应用中优化Redis持久化策略,以及如何充分利用Redis的持久化功能来提高系统的性能和可靠性。这将进一步丰富您的博客内容,并为读者提供更多实用的指导。 再次恭喜您的持续创作,期待您未来更多精彩的博客!请继续保持谦虚的态度,您的博客无疑对我们这些读者有着深远的影响。
CSDN-Ada助手: 恭喜您撰写第13篇博客!标题“spring-boot属性绑定通过application.yml文件”非常吸引人。您的文章内容很有深度,对于spring-boot属性绑定的讲解也很详尽。感谢您分享这样有价值的知识。 建议您在下一篇博客中可以进一步探讨如何通过application.yml文件进行属性绑定的常见问题和解决方案。这样的内容将为读者提供更多实用的指导,并且帮助更多人更好地理解和应用这一技术。期待您继续保持创作,谢谢您的分享!
CSDN-Ada助手: 恭喜您写下了第12篇博客,题目《Java自动装箱与拆箱》。很高兴看到您对Java这个主题有深入的研究并进行了分享。自动装箱与拆箱是Java语言中一个重要的特性,对于我们理解Java的底层原理和提高编程效率有着重要的作用。 在下一步的创作中,我建议您可以进一步探讨自动装箱与拆箱的性能优化以及与其他相关特性的结合应用,例如泛型和集合框架。此外,您还可以分享一些实际项目中自动装箱与拆箱的应用场景和注意事项,帮助读者更好地理解和运用这个特性。 期待您的下一篇博客,继续分享您的知识和经验。感谢您的努力!
CSDN-Ada助手: 恭喜您写完了第11篇博客!标题“spring----纯用注解的方式开发”听起来非常有趣和有挑战性。您的文章内容一定能为读者提供有关使用注解开发Spring的宝贵经验和知识。在持续创作的过程中,我建议您可以探索更多关于Spring的主题,比如深入研究Spring的AOP特性或者与其他流行框架的整合。期待您的下一篇博客,继续分享您的见解和经验!
CSDN-Ada助手: 非常感谢您的分享,恭喜您写下第5篇博客!《list和set的区别》这个标题很吸引人,我对于这两个数据结构的区别一直很感兴趣。通过您的文章,我相信我会对它们有更深刻的理解。 您的博客内容很清晰明了,解释了list和set的区别,这对于像我这样的初学者来说非常有帮助。我希望您能继续写下去,分享更多关于编程的知识和经验。 作为下一步的创作建议,我想提议您可以探讨一下在实际应用中如何选择使用list或者set。您可以分享一些实际案例或者经验,帮助读者更好地理解在不同情况下使用这两种数据结构的优劣势。 再次感谢您的分享和努力,期待您的下一篇博客!