java中thread线程start和run的区别
主要介绍了java中thread线程start和run的区别,run()是Runnable接口中定义的一个方法,是为了让客户程序员在这个方法里写自己的功能代码的。直接调用和普通的类调用自己的成员方法是没有任何区别的 在Java编程语言中,线程是并发执行任务的基础单元。`Thread`类是Java中用于创建和管理线程的核心类,而`start()`和`run()`方法是与线程执行密切相关的方法,它们之间存在显著的区别。 `run()`方法是`Runnable`接口或`Thread`类中的一个成员方法。当你需要创建一个线程并指定它要执行的任务时,通常有两种方式:一是直接继承`Thread`类并重写`run()`方法;二是实现`Runnable`接口并在实现类中定义`run()`方法。`run()`方法是程序员编写线程具体执行逻辑的地方,这里的代码会在一个新的线程上下文中运行。 然而,直接调用`run()`方法与调用`start()`方法有着本质的不同。当你通过一个`Thread`对象调用`run()`方法时,这实际上就像调用任何普通类的方法一样,不会启动新的线程,代码会在当前线程(通常是主线程)中顺序执行。这意味着`run()`方法中的代码不会与其他代码并行执行,也就没有并发性。 相比之下,`start()`方法是真正启动新线程的关键。当你调用`Thread`对象的`start()`方法时,Java虚拟机(JVM)会为该线程分配系统资源,创建一个新的线程,并将`run()`方法的代码放入这个新线程的执行队列。此时,`run()`方法的内容将在新线程中异步执行,与主线程或其他已经存在的线程并行运行。 在给定的代码示例中: ```java public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } }; t.run(); System.out.println("ping"); } static void pong() { System.out.println("pong"); } ``` 由于`t.run()`被调用而不是`t.start()`,整个程序仅有一个线程(主线程),因此输出总是"pong ping"。如果改为`t.start()`,那么`pong()`方法将在新线程中运行,可能会与主线程中的`System.out.println("ping")`交错执行,导致不同的输出结果。 总结来说,`run()`方法是程序员定义线程执行逻辑的地方,而`start()`方法才是真正启动新线程并执行`run()`方法的入口。如果你希望实现线程并发,必须使用`start()`方法,直接调用`run()`只会同步执行,失去并发的意义。至于选择继承`Thread`还是实现`Runnable`,取决于你的需求,实现`Runnable`可以避免Java单继承的限制,允许类同时继承其他类。但在需要重写`Thread`类的某些方法或直接使用`Thread`特性时,继承`Thread`可能是更好的选择。