Java中,启动线程的两种方式包括start()和run()方法。虽然它们都可以启动线程,但是它们之间有一些重要的区别。
首先,start()方法是一个非常重要的方法,因为它会使线程开始执行。当调用start()方法时,JVM会为该线程分配一个新的堆栈,并在新的堆栈上运行该线程的run()方法。
public void start() public void run()
接下来,让我们来比较一下这两个方法。当我们调用start()方法时,线程进入了就绪状态,并等待JVM调用它的run()方法。而如果我们调用run()方法,那么线程直接在当前堆栈上运行,而不是在新的堆栈上运行。因此,如果我们熟悉线程的工作原理,那么我们可以推断出,调用run()方法不会创建新的线程。
此外,对于实现Runnable接口的类,其start()方法不会执行run()方法,而是会调用它自己的run()方法。例如:
public class MyRunnable implements Runnable { public void run() { //实现线程要做的工作 } public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); //调用的是Thread自己的start()方法 } }
最后,需要注意的是,如果我们在一个线程中调用自己的start()方法,那么它会发生什么呢?其实,这是非常危险的行为,因为它会导致线程死锁或者永远等待。这是因为在调用start()方法时,JVM会为该线程分配一个新的堆栈,而如果我们在当前堆栈上运行run()方法,那么线程将永远等待自己的run()方法完成。
综上所述,start()方法是启动线程的首选方式,因为它会创建一个新的线程,并在新的线程上运行run()方法。而调用run()方法不会创建新的线程,因此它在很多情况下都是不适用的。