Java线程run方法里面为什么没有执行

在Java中,线程是一种独立执行的代码片段。通过线程,我们可以实现多任务并行执行的效果。一个线程的执行是通过调用其run()方法实现的。然而,有时候我们会发现即使线程已经启动了,但run()方法里面的代码却没有被执行。这究竟是为什么呢?

Java线程的基本概念

在理解为什么线程的run()方法没有执行之前,我们先来了解一下Java线程的基本概念。

创建线程

在Java中,我们可以通过继承Thread类或者实现Runnable接口来创建线程。以实现Runnable接口为例:

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("This is run method.");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

在上面的代码中,我们创建了一个MyRunnable类,实现了Runnable接口,并在run()方法中输出一段文字。在main()方法中,我们创建了一个MyRunnable对象,并将其传递给一个新建线程,然后启动线程。

启动线程

在Java中,线程的启动是通过调用start()方法实现的。一旦调用了start()方法,线程将会被放入就绪队列中,等待被调度执行。当线程被调度执行时,会执行其run()方法中的代码。

为什么线程的run()方法没有执行

在有些情况下,我们会发现线程已经启动了,但run()方法里面的代码却没有被执行。这通常是由于以下几个原因导致的:

  1. 重写了Thread类的run()方法而不是实现Runnable接口

如果我们继承Thread类并重写了run()方法,那么在启动线程时应该调用start()方法而不是直接调用run()方法。直接调用run()方法并不会创建一个新的线程,而是在当前线程中执行run()方法中的代码。

public class MyThread extends Thread {
    public void run() {
        System.out.println("This is run method.");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        // myThread.run(); // 错误的调用方式
        myThread.start();
    }
}
  1. run()方法中没有写任何代码或者代码执行时间过短

有时候我们可能会忘记在run()方法中写入具体的代码,或者代码执行时间非常短暂,可能就在创建线程后立即结束了。这样的话,我们可能会以为线程的run()方法没有执行,其实是因为执行时间太短而已。

public class MyRunnable implements Runnable {
    public void run() {
        // 空方法或者执行时间过短
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}
  1. 线程启动顺序的问题

有时候,如果一个线程在另一个线程启动之前就已经启动了,那么较早启动的线程可能会最先执行完,导致后面启动的线程的run()方法没有被执行。

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("This is run method.");
    }

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);
        
        thread1.start();
        thread2.start();
    }
}

在上面的代码中,我们创建了两个线程thread1thread2,并且它们都使用了同一个MyRunnable对象。如果thread1thread2几乎同时启动,那么run()方法只会在一个线程中