- 什么是线程
在 Java 中,我们可以通过 java.lang.Thread
类创建线程。线程是一个可以独立运行的子任务。与程序中的其他子任务不同,线程在操作系统层面上是一种独立的执行单元。在单个应用程序内,多个线程可以同时执行,每个线程都有自己的栈和局部变量,线程之间可以共享堆上的变量。由于线程在同时执行,因此在多线程编程中需要引入线程同步、锁和互斥等概念来保证数据的一致性和线程安全。
Java 线程的创建和运行分为两个步骤,分别是:
- 通过继承
java.lang.Thread
类或实现java.lang.Runnable
接口的方式创建线程; -
调用线程对象的
start()
方法启动线程。 -
start()
方法和run()
方法的区别
start()
方法和 run()
方法都是线程的启动方法,但是它们的执行效果是不同的。
-
start()
方法用于启动一个新线程,该线程会在新的 JVM 栈中独立运行。start()
方法调用后立刻返回,新线程在 JVM 中独立运行,并且就绪线程池中的其它线程可能会在新线程运行之前执行。 -
run()
方法是线程体的逻辑代码,在start()
方法被调用后,JVM 会自动调用该方法。run()
方法不会启动一个新的线程,而是在当前线程中执行。因此,如果直接调用run()
方法,它会在当前线程中执行,不会启动新的线程。
下面是一个例子:
public class ThreadTest implements Runnable {
@Override
public void run() {
System.out.println("Thread started!");
}
public static void main(String[] args) {
Thread thread = new Thread(new ThreadTest());
thread.start(); // 启动新线程
// thread.run(); // 不会启动新线程,直接在当前线程中执行
}
}
在上面的例子中,我们创建了一个实现 java.lang.Runnable
接口的类 ThreadTest
。在 run()
方法中,我们打印了一条消息。在 main()
方法中,我们创建一个新的线程对象,并传入实例化的 ThreadTest
类。当我们调用 thread.start()
启动线程后,JVM 会自动调用 ThreadTest
类中的 run()
方法,输出 "Thread started!"
。
如果我们取消注释掉 thread.run()
,直接在当前线程中执行,程序只会输出 "Thread started!"
,并不会启动新的线程。
- 总结
在 Java 线程中,start()
方法和 run()
方法是线程的启动方法,但是它们的执行效果是不同的。start()
方法会启动一个新的线程,而 run()
方法不会启动新线程,只会在当前线程中执行。
在实际开发中,我们应该优先使用 start()
方法来启动线程,避免使用 run()
方法直接在当前线程中执行,从而提高程序的并发处理能力。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 线程中start方法与run方法的区别详细介绍 - Python技术站