调用`start()`方法时会执行`run()`方法是因为这是`Thread`类中的设计。在`Thread`类中,`start()`方法用于创建并启动一个新的线程,并在新线程中执行`run()`方法。`start()`方法会完成一些底层的准备工作,包括线程的创建、调度等,然后在新线程中调用`run()`方法来执行线程的主体逻辑。
直接调用`run()`方法就像普通的方法调用一样,不会创建新的线程,而是在当前线程中按照顺序执行`run()`方法中的代码。这样做没有实现多线程的目的,并且会失去并发执行的能力。
为什么不能直接调用`run()`方法来实现多线程的并发运行呢?这是因为线程的创建和调度需要一些底层的工作,比如为线程分配资源、建立线程栈等。这些工作由`start()`方法完成,而直接调用`run()`方法会忽略这些准备工作,使得线程无法独立运行。
因此,为了实现多线程的并发执行,我们要使用`start()`方法来创建并启动新线程,然后由`start()`方法在新线程中调用`run()`方法来执行线程的主体逻辑。这样通过`start()`方法启动的线程才能够在独立的线程上并发执行,实现多线程的效果。