多线程——run()方法与start()方法有什么区别

接触到多线程的客官们都会遇见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~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/84679020