run()方法和start()方法的区别
一、start()是什么?
用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
二、run()是什么?
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
三、具体代码实例
下面我们来看具体实现,首先是验证调用run()方法并没有真正的启动一个线程
public class MyRunnable implements Runnable {
@Override
public void run() {
try {
// 睡眠3秒
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("实现Runnable接口的线程");
}
}
public class MyRunnableTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("--------开始调用线程--------");
Thread thread= new Thread(new MyRunnable());
thread.run();
System.out.println("--------调用线程结束--------");
}
}
我们想要看到,如果run()方法启动了一个线程的话,那么“MyRunnable”中我们设置了休眠,主线程应该继续往下执行,那么输出的结果应该就是:
--------开始调用线程--------
--------调用线程结束--------
实现Runnable接口的线程
但实际运行结果是:
--------开始调用线程--------
实现Runnable接口的线程
--------调用线程结束--------
接下来我们验证,调用start()方法才算真正的启动了一个线程
public class MyRunnableTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("--------开始调用线程--------");
Thread thread= new Thread(new MyRunnable());
thread.start();
System.out.println("--------调用线程结束--------");
}
}
--------开始调用线程--------
--------调用线程结束--------
实现Runnable接口的线程
总结来说就是:
线程的run()方法是由java虚拟机直接调用的,如果我们没有启动线程(没有调用线程的start()方法,而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程,(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,从而违背了创建线程的初衷,也就是说并没有创建一个新的线程。
四、start()和run()方法的区别:
1、start方法用来启动相应的线程。需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;
2、run方法只是thread的一个普通方法,并没有创建新线程,而是运行在当前线程
3、run方法必须是public的访问权限,返回类型为void。
参考
链接: 源码解析
链接: 线程中start方法和run方法的区别
链接: run()方法和start()方法的区别