Java中,线程是程序的执行流,它是在进程中执行的。可以通过继承Thread类或实现Runnable接口来创建线程。在创建线程时,我们需要注意线程的生命周期。在Java中,线程的生命周期可以分为New、Runnable、Blocked、Waiting、Timed Waiting和Terminated这6种状态
Java中,线程是程序的执行流,它是在进程中执行的。可以通过继承Thread类或实现Runnable接口来创建线程。在创建线程时,我们需要注意线程的生命周期。在Java中,线程的生命周期可以分为New、Runnable、Blocked、Waiting、Timed Waiting和Terminated这6种状态。
线程的启动是通过调用start方法来实现的;线程的执行是通过run方法来实现的。那么,start和run方法有什么区别呢?
区别1:start方法和run方法的功能不同
start方法的作用是启动一个新线程,新线程会执行对应Thread对象的run方法,当调用start方法后,该线程会被加入到线程调度器的等待队列中,等待获取CPU时间片,从而运行线程。
run方法的作用是实现线程的执行体,也就是线程要执行的任务或操作。如果直接调用run方法,那么相当于在当前的主线程中执行该方法,不会创建新的线程。
下面是两个示例说明:
// 示例1:使用start方法
public class MyThread extends Thread {
@Override
public void run() {
// 实现线程的执行体
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start();
thread2.start();
}
}
// 示例2:直接调用run方法
public class MyThread implements Runnable {
@Override
public void run() {
// 实现线程的执行体
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.run(); // 直接调用run方法,相当于在主线程中执行
thread2.run();
}
}
在示例1中,通过使用start方法来启动两个线程,新线程会执行MyThread对象的run方法,输出结果如下:
Thread-0:1
Thread-1:1
Thread-0:2
Thread-1:2
Thread-0:3
Thread-1:3
Thread-0:4
Thread-1:4
Thread-0:5
Thread-1:5
在示例2中,直接调用run方法,相当于在主线程中执行,输出结果如下:
main:1
main:2
main:3
main:4
main:5
main:1
main:2
main:3
main:4
main:5
可以看到,直接调用run方法并没有创建新的线程,而是在主线程中执行了MyThread对象的run方法,因此两个线程的执行结果都是在主线程中输出,没有体现出多线程的优势。
区别2:start方法和run方法执行的时间点
start方法调用后会将线程加入到等待队列中,等待获取CPU时间片运行;而run方法直接在当前线程中执行,不会新建线程。
当调用start方法时,线程被加入到等待队列中,等待获取CPU时间片,同时当前线程继续执行下面的代码。当线程获取到时间片后,才会执行线程的run方法,完成对应的任务。
下面是一个示例:
public class MyThread extends Thread {
@Override
public void run() {
try {
Thread.sleep(5000); // 线程睡眠5s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行完成");
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
thread1.start();
System.out.println(Thread.currentThread().getName() + "继续执行");
}
}
在上面的示例中,线程1被启动后,会睡眠5s,然后输出一个执行信息。在启动线程1后,主线程继续执行,输出另一个执行信息。输出结果如下:
main继续执行
Thread-0执行完成
可以看到,当主线程输出“继续执行”时,线程1并没有立即执行对应的任务,而是被加入到了等待队列中,等待获取CPU时间片才开始执行任务。5s后,线程1才输出执行完成的信息。
综上所述,start方法和run方法的区别在于:
- start方法是启动一个新线程,run方法是实现线程的执行体;
- start方法会将线程加入到等待队列中,等待获取CPU时间片运行,而run方法直接在当前线程中执行;
- 调用start方法启动线程时,当前线程继续执行下面的代码;线程获取时间片后执行run方法。
本文标题为:java中thread线程start和run的区别
基础教程推荐
- Spring MVC项目中的异常处理详解 2022-12-04
- Mybatis图文并茂讲解分页插件 2023-02-19
- 一文详解密码的正则表达式写法 2024-01-11
- Java手写线程池之向JDK线程池进发 2023-06-23
- SpringCloud Feign高级配置详解 2023-05-08
- 在java中使用mongodb游标(DBCursor)的罕见行为,即使已经到达最后一个元素 2023-11-09
- Java设计模式之状态模式State Pattern详解 2023-06-30
- Maven依赖管理之parent与dependencyManagement深入分析 2023-06-17
- java.sql.SQLException“自动提交模式下的数据库”的原因 2023-11-09
- Linux环境下配置Tomcat以及JAVA 2023-09-01