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()
方法里面的代码却没有被执行。这通常是由于以下几个原因导致的:
- 重写了
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();
}
}
- 在
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();
}
}
- 线程启动顺序的问题
有时候,如果一个线程在另一个线程启动之前就已经启动了,那么较早启动的线程可能会最先执行完,导致后面启动的线程的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();
}
}
在上面的代码中,我们创建了两个线程thread1
和thread2
,并且它们都使用了同一个MyRunnable
对象。如果thread1
和thread2
几乎同时启动,那么run()
方法只会在一个线程中