返回

剖析start方法与run方法的不同之处

后端

在Java中,线程是执行任务的基本单位,它可以独立运行并执行一系列操作。线程的生命周期由多种方法控制,其中start()和run()方法是两个最常用的方法,它们都用于启动线程,但其行为和功能却截然不同。

1. 方法调用:

  • start()方法 :start()方法用于启动线程,当调用此方法时,线程会从开始执行其任务。需要注意的是,start()方法只能被调用一次,当一个线程已经启动后,再次调用start()方法将会抛出IllegalThreadStateException异常。
  • run()方法 :run()方法是线程的入口点,当线程被启动时,它会执行run()方法中定义的任务。run()方法可以被调用多次,因为它是线程执行任务的实际方法。

2. 线程状态:

  • start()方法 :当调用start()方法后,线程会从新建状态转变为就绪状态,然后操作系统会根据线程的优先级将其调度到CPU上执行。
  • run()方法 :当线程被调度到CPU上执行时,run()方法才会被调用,此时线程的状态会变成运行状态。

3. 线程并发:

  • start()方法 :start()方法可以启动多个线程,使它们并发执行。这使得我们可以在不同的线程中执行不同的任务,从而提高程序的效率和性能。
  • run()方法 :run()方法本身并不具有并发性,它只是线程执行任务的具体实现。

4. 用法示例:

  • start()方法

    public class MyThread extends Thread {
        @Override
        public void run() {
            // 执行任务
        }
    }
    
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
    
  • run()方法

    public class MyThread implements Runnable {
        @Override
        public void run() {
            // 执行任务
        }
    }
    
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        Thread threadObject = new Thread(thread);
        threadObject.start(); // 启动线程
    }
    

5. 注意点:

  • start()方法只能调用一次,重复调用会抛出异常。
  • run()方法可以调用多次,因为它只是线程执行任务的具体实现。
  • start()方法可以启动多个线程,从而实现并发执行。
  • run()方法本身不具有并发性,它只是线程执行任务的具体实现。

总之,start()方法和run()方法是两种完全不同的方法,它们在调用方式、线程状态、线程并发性和用法示例方面都有所区别。开发者需要根据具体需求正确使用这些方法,以便有效地实现多线程编程。