定义
- run():在Java中,
run()
方法是Runnable
接口中的一个方法,也是Thread
类的一个方法(尽管在Thread
类中,它通常是被重写的)。这个方法定义了线程执行的任务,即线程体。它是一个非同步方法,可以被线程对象直接调用,但直接调用它并不会启动新的线程,而是在当前线程中顺序执行run()
方法内的代码。 - start():
start()
方法是Thread
类的一个方法,用于启动线程。调用start()
方法后,会创建一个新的线程来执行run()
方法中的代码。这意味着start()
方法会使得线程从创建状态进入就绪状态,等待CPU的调度执行。
功能
- run():
run()
方法的主要功能是定义线程将要执行的任务或操作。它是线程执行的核心部分,包含了线程的具体工作内容。 - start():
start()
方法的主要功能是启动线程,使线程进入就绪状态,等待CPU的调度执行。它不会执行线程中的任务代码,而是安排一个线程去执行这些代码。
应用场景
- run():
run()
方法通常被重写以定义线程的具体行为。例如,在实现Runnable
接口的类中,你需要重写run()
方法来提供线程的执行体。当你将实现了Runnable
接口的类的实例传递给Thread
类的构造函数,并调用Thread
对象的start()
方法时,实际上是由JVM在新线程中调用该run()
方法。 - start():
start()
方法用于启动线程。当你需要并行处理任务时,会创建Thread
对象(或实现Runnable
接口的类的实例,并将其传递给Thread
的构造函数),然后调用start()
方法来启动线程。这样,你就可以同时执行多个任务,从而提高程序的执行效率。
主要区别
- 位置与类型:
run()
和start()
都位于Thread
类中,但run()
方法也可以被Runnable
接口的实现类重写。run()
是非同步方法,而start()
是同步方法,用于启动线程。 - 功能:
run()
方法定义了线程要执行的任务,而start()
方法用于启动线程,使线程进入就绪状态,等待CPU调度执行。 - 线程数量:直接调用
run()
方法不会创建新线程,而是在当前线程中执行run()
方法内的代码。调用start()
方法会创建一个新的线程来执行run()
方法中的代码。 - 调用次数:
run()
方法可以被调用多次,但通常不会这样做,因为它不会启动新线程。start()
方法在一个线程的生命周期内只能被调用一次,多次调用会导致IllegalThreadStateException
异常。
例子
假设我们有一个简单的任务,打印线程的名称:
public class MyRunnable implements Runnable {
@Override
public void run() {
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + " is running");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
// 调用start()方法启动线程
thread.start(); // 输出:Thread-0 is running(具体线程名可能不同)
// 如果直接调用run()方法,则在当前线程(主线程)中执行
// myRunnable.run(); // 输出:main is running
}
}
在这个例子中,通过调用start()
方法,我们启动了一个新的线程来执行run()
方法中的代码,输出了新线程的名称。如果取消注释直接调用run()
方法的代码,那么run()
方法将在主线程中执行,输出将是main is running
。