在多数编程语言中,线程有两种启动方式:start()和run()。start()方法创建并启动一个新线程,而run()方法只是在当前线程中调用线程函数。下面分别介绍一下它们的区别:
- start()方法:创建并启动新线程。调用start()方法后,程序会为线程分配新的堆栈空间,并在新线程上运行线程函数。因为创建新线程需要时间,所以start()方法会立即返回,不会阻塞当前线程。需要注意的是,同一个线程对象只能调用一次start()方法,因为线程对象在启动后就被“消耗”了。
- run()方法:在当前线程中执行线程函数。调用run()方法会直接调用线程函数,并在当前线程中执行,而不会创建新线程。因为在当前线程中执行线程函数,所以调用run()方法会阻塞当前线程,直到线程函数执行完毕。需要注意的是,调用run()方法只是在当前线程中执行线程函数,而不是创建新线程,所以不会有多线程并发的效果。
下面是一个Java的例子,展示了start()和run()方法的区别:
public class MyThread extends Thread {
public void run() {
System.out.println("In run method - thread " + Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
// 使用start方法创建并启动新线程
myThread.start(); // 输出: In run method - thread Thread-0
// 使用run方法在当前线程中执行线程函数
myThread.run(); // 输出: In run method - thread main
}
}
在这个例子中,使用start()方法创建并启动一个新线程,输出了线程名Thread-0。然后使用run()方法在当前线程中执行线程函数,输出了主线程的名字main。由此可以看出,start()方法会创建新线程并启动,而run()方法只是在当前线程中执行线程函数。