接触到多线程的客官们都会遇见run()方法与start()方法,这两个都是多线程中举足轻重的大佬。
那么这两个大佬的真面目是什么呢,有啥区别吗?
这里就要普及一下线程如何启动了。
通常,系统通过调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态,而非运行状态,这也就意味着这个县城可以被JVM来调度执行。在调度过程中,JVM会通过调用线程类的run()方法来完成试机的操作,当run()方法结束之后,此线程就会终止。
那么问题来了,我可不可以不通过start()方法,直接调用run()方法呢?
当然可以。如果直接调用线程类的run()方法,它就会被当做一个普通的函数调用,程序中任然只有主线程这一个线程。也就是说,star()方法可以异步地调用run()方法,但是直接调用run()方法确实同步的,因此也就不能达到多线程的目的啦~~
由此我们可以知道,只有通过调用线程类的start()方法可能真正达到多线程的目的。
多说无益,下面直接通过一个例子来说明run()方法和start()方法的区别
package javatest;
public class StartAndRun {
public static void test1() {
System.out.println("test1:begin");
Thread t1=new ThreadDemo();
t1.start();
System.out.println("test1:end");
}
public static void test2() {
System.out.println("test2:begin");
Thread t2=new ThreadDemo();
t2.run();
System.out.println("test2:begin");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test1();
try {
Thread.sleep(5000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
class ThreadDemo extends Thread{
public void run() {
System.out.println("ThreadDemo:begin");
try {
Thread.sleep(1000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("ThreadDemo:end");
}
}
程序运行结果为:
从test1的运行结果可以看出,线程t1是在test1方法结束后才执行的System.out.println("test1:end")语句,不需要等待t1.start()运行结果就可以执行。因此,在test1中调用start()方法是异步的,所以main线程与t1线程是异步执行的。从test2的运行结果可以看出,调用t1.run()是同步的调用方法,因为System.out.println("test2:end")语句只有等t1.run()调用结束后才能执行。
总结:
run()和start()的区别可以用一句话概括:单独调用run()方法,是同步执行;通过start()调用run(),是异步执行。
好啦,以上就是关于run()方法和start()方法之间区别的相关总结,如果大家有什么更具体的发现或者发现文中有描述错误的地方,欢迎留言评论,我们一起学习呀~~
Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!