当前位置: 首页 > 面试题库 >

Java:为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?

蒯宇定
2023-04-24

这是另一个非常经典的 java 多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来!

new 一个 Thread,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。

而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

总结: 调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。

 类似资料:
  • 在下面的代码中编辑Player类,以便代码给出预期的输出。不要只打印预期的输出。不要编辑比赛类。不允许在Player类中添加任何变量。只添加必要的方法。您的代码会给出与预期输出完全相同的输出吗?解释原因。

  • 问题内容: 为什么我们在Java中使用该方法?(请给出有关内存限制的答案。)这会减少内存使用吗?如果是,那怎么办?这样会减少内存泄漏的影响吗? 问题答案: 除了 不使用克隆外,还实现一个复制构造函数 ,您询问了内存限制。 克隆 的想法是创建克隆对象的精确副本。因此,在最坏的情况下,此后您将使用两倍的内存量。实际上- 少了一点,因为String经常被嵌入并且(通常)不会被克隆。即使由clone方法/

  • 问题内容: 我正在阅读有关线程的文章,发现我们不能在同一线程实例上两次调用start方法。但我不知道相同的确切原因。那么为什么我们不能两次或更多次呢? 问题答案: 我认为Thread对象是实际运行上下文的“句柄”。如果允许创建与同一个java.lang.Thread关联的许多并发执行,那么您期望getStackTrace()和getState()方法返回什么? 我想Thread类本可以设计为允许产

  • 我正在修改我以前使用的Visitor模式。我们有基类Element,它有虚拟方法接受(Visitor),并且这个方法在继承自Element的所有类中都被重写。在任何派生类中,接受()所做的就是调用visitor- 为什么客户不能直接打电话给访客- 调用元素中有哪些有用的信息。接受(访客),然后依次呼叫访客。参观(元素)?这使得Visitor模式的使用很麻烦,并且在所有元素类的层次结构中都需要额外的

  • 本文向大家介绍为什么我们在jQuery中使用JSON.stringify()方法?,包括了为什么我们在jQuery中使用JSON.stringify()方法?的使用技巧和注意事项,需要的朋友参考一下 JSON或JavaScript Object Notation是一种轻量级的基于文本的开放标准,旨在用于人类可读的数据交换。使用JSON.stringify()方法将JavaScript对象转换为字符

  • 我知道string1将包含一个空字符串。我的问题是为什么像下面这样两次调用nextLine方法会出现错误: