在java开发中,简述为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?


在 Java 中,`start()` 和 `run()` 方法都与线程有关。当我们创建一个新的线程对象时,线程的执行实际上并没有开始。为了开始线程的执行,我们必须调用线程对象的 `start()` 方法。 当我们调用 `start()` 方法时,Java 虚拟机会在新的线程上调度并执行 `run()` 方法。实际上,`start()` 方法是启动了一个新的线程,并立即返回,而 `run()` 方法是线程的执行体,它包含了线程的代码逻辑。 为什么我们不能直接调用 `run()` 方法呢?这是因为 `run()` 方法本身并不是启动新线程的方法。它只是定义了线程的执行逻辑。如果我们直接调用 `run()` 方法,那么这个方法将在当前线程中执行,而不是启动新的线程。这并不符合我们创建线程的初衷,即启动一个新的执行路径,让程序在新的线程上运行。 我们不能直接调用 `run()` 方法来启动线程,而需要调用 `start()` 方法来启动新线程并运行 `run()` 方法。 [2023-11-09 17:18:49 | AI百度知道回答 | 219点数解答]
相关提问
- import javax.swing.*; import java.awt.*; import java.awt.datatransfer.clipboard; import java.awt.datatransfer.stringselection; import java.awt.datatransfer.transferable; import java.awt.event.*; import java.io.*; import java.nio.file.files; import java.nio.file.path; import java.nio.file.paths; import java.time.localdatetime; import java.util.hashmap; import java.util.list; import java.util.map; import java.util.random; public class copy { static private final jtextarea textarea = new jtext(1497点数解答 | 2024-08-25 09:40:33)321
- def find_indices(text, query): # 将文本转换为小写,以实现不区分大小写的搜索 text_lower = text.lower() query_lower = query.lower() start = 0 # 初始化一个列表来存储查询内容的索引 indices = [] # 使用find方法来查找查询内容的索引 while true: start = text_lower.find(query_lower, start) if start == -1: break # 将索引添加到列表中,并更新搜索的起始位置 indices.append(start) start += 1 # 移动到找到的词的下一个字符,以避免重复计数 return indices # 文档内容 document = """ it is(231点数解答 | 2024-10-21 21:44:08)223
- dm.jdbc.driver.dmexception: 数据溢出 at dm.jdbc.driver.dberror.throwexception(dberror.java:636) at dm.jdbc.c.b.p.s(msg.java:225) at dm.jdbc.c.b.p.p(msg.java:185) at dm.jdbc.c.b.p.o(msg.java:166) at dm.jdbc.c.a.a(dbaccess.java:776) at dm.jdbc.c.a.a(dbaccess.java:327) at dm.jdbc.c.a.a(dbaccess.java:435) at dm.jdbc.driver.dmdbpreparedstatement.executeinner(dmdbpreparedstatement.java:284) at dm.jdbc.driver.dmdbpreparedstatement.do_executequery(dmdbpreparedstatement.java:383) at dm.jdbc.driver.(598点数解答 | 2024-10-15 15:48:38)224
- 问题排查:dm.jdbc.driver.dmexception: 数据溢出 at dm.jdbc.driver.dberror.throwexception(dberror.java:636) at dm.jdbc.c.b.p.s(msg.java:225) at dm.jdbc.c.b.p.p(msg.java:185) at dm.jdbc.c.b.p.o(msg.java:166) at dm.jdbc.c.a.a(dbaccess.java:776) at dm.jdbc.c.a.a(dbaccess.java:327) at dm.jdbc.c.a.a(dbaccess.java:435) at dm.jdbc.driver.dmdbpreparedstatement.executeinner(dmdbpreparedstatement.java:284) at dm.jdbc.driver.dmdbpreparedstatement.do_executequery(dmdbpreparedstatement.java:383) at dm.jdbc.dr(403点数解答 | 2024-10-15 15:48:41)914
- 在java开发中,简述为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?(219点数解答 | 2023-11-09 17:18:49)235
- (1)设计pci抽象类,接口内有约定设备启动的start()方法、约定设备关闭的stop()方法 (2)设计描述显卡的displaycard类、描述声卡的soundcard类和描述网卡的netcard类,这三个都是pci的子类,因此具有了pci接口中声明的设备启动start方法和设备关闭stop方法 (3)设计描述主板的mainboard类,该类中有一个pci类型的数组,描述主板提供的5个插槽,有一个add(pci device)方法,实现向主板插入指定pci设备device,有一个run()方法,实现依次启动主板上的所有pci设备,有一个stop()方法,实现依次关闭主板上所有pci设备 (4)设计计算机类computer类,该类有一个私有的mainboard类型的成员变量cmb, 有一个start()方法,实现开机、运行主板设备的功能;有一个stop()方法,实现关机,停止主板设备的功能 (5)设计computertest主类,在main方法中,创建computer类型的对象com,并通过方法调用模拟启动计算机,关闭计算机操作。(716点数解答 | 2024-12-08 23:38:38)216
- 模拟实现如下情形:计算机包括主板,主板上有5个pci插槽,可插装显卡、声卡、网卡等pci设备。主板启动时,依次启动主板上的各个pci设备,关机时,依次关闭主板上的各个pci设备。 (1)设计pci抽象类,接口内有约定设备启动的start()方法、约定设备关闭的stop()方法 (2)设计描述显卡的displaycard类、描述声卡的soundcard类和描述网卡的netcard类,这三个都是pci的子类,因此具有了pci接口中声明的设备启动start方法和设备关闭stop方法 (3)设计描述主板的mainboard类,该类中有一个pci类型的数组,描述主板提供的5个插槽,有一个add(pci device)方法,实现向主板插入指定pci设备device,有一个run()方法,实现依次启动主板上的所有pci设备,有一个stop()方法,实现依次关闭主板上所有pci设备 (4)设计计算机类computer类,该类有一个私有的mainboard类型的成员变量cmb, 有一个start()方法,实现开机、运行主板设备的功能;有一个stop()方法,实现关机,停止主板设备的功能 (5)设计co(637点数解答 | 2024-12-09 08:31:54)184
- 作为c#工程师,整数list中取出最⼤数(找最⼤值)不能⽤max⽅法?(448点数解答 | 2023-11-09 17:55:36)280
- 设计一个接口person,包含一个方法makehappy()。然后创建一个实现该接口的类china,并在china类中实现makehappy()方法,使其打印出"are you ok!"。最后,编写一个调用类test,在其中创建一个china对象并调用其makehappy()方法。1)接口定义(person.java)2)实现类(china.java)3)调用类(test.java)(176点数解答 | 2025-01-03 09:14:03)164
- import com.opencsv.csvreader; import com.opencsv.exceptions.csvvalidationexception; import java.io.filereader; import java.io.ioexception; import java.text.parseexception; import java.text.simpledateformat; import java.util.*; public class stockstatistics { public static void main(string[] args) { string filepath = "stocks.csv"; // 请确保csv文件与此java文件在同一目录下,或提供完整路径 simpledateformat sdf = new simpledateformat("yyyy-mm-dd"); map<string, stockdata> monthlydata = new has(66点数解答 | 2024-11-13 15:31:04)189
- at java.lang.Thread.run(Thread.java:748) Caused by: java.sql.BatchUpdateException: Code: 242. DB::Exception: Table is in readonly mode (replica path: /data01/clickhouse/data/01/ads_reportcenter/tb_over_cover_4g_sc2nc_list_d_cluster_tmp1739246639849/replicas/cluster01-01-01). (TABLE_IS_READ_ON**) (version 22.6.7.7 (official build)) , server ClickHouseNode [uri=http://10.214.50.88:8123/ads_reportcenter, options={async_insert=0,wait_for_async_insert=1,connect_timeout=6000000,socket_timeout=(404点数解答 | 2025-02-11 14:14:17)153
- c语言现在有n枚硬币,其中有一枚是假的,假的硬币比真币轻,但也只轻一点点,而**和真币的外观是一模一样的,从外观上无法辨别硬币的真假,请写程序找出**。 程序的要求: 必须使用递归调用函数实现 递归函数原型必须为:int findfakecoin(int *p, int low, int high) 程序中必须包含函数:int getsum(int *p, int start, int end) main函数已经写好,请编写程序剩余部分的代码并提交。 main函数如下: int main() { int coins[n]; int m; int index; int getsum(int *p, int start, int end); int findfakecoin(int *p, int low, int high); scanf("%d", &m); for (int i = 0; i < m; ++i(497点数解答 | 2024-12-02 22:03:42)204