(四十五)run()方法与start()方法有哪些区别

一、直接调用run,被当做普通方法,不能实现多线程

start()方法能异步调用run()方法---不用等run执行完毕,就可执行下面的代码(以下代码深刻理解此句话)

直接调用run()方法却是同步的----要等run()执行完毕,才能执行下一个run();程序中只有主线程这一个线程,即执行路径只有这一条

run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:

而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。
 

二、调用start()方法启动一个线程

start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,

通常,系统通过调用线程类的start()方法来启动一个线程,此时该线程处于就绪状态,而非运行状态,也就意味着这个线程可以被JVM来调度执行。在调度执行过程中,JVM通过调用线程类中的run()方法来完成实际的操作,当run()方法结束,此线程终止


public class Demo extends Thread
	{
	public void run()
	{
		System.out.println(Thread.currentThread().getName()+":begin");
		try
		{
			Thread.sleep(1000);
		 }catch(InterruptedException e){
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+":end");
	}	 
}  
public class Test {

	public void test1()
	{
		System.out.println("test1:begin");
		Thread t1=new Demo();
		t1.start();
		System.out.println("test1:end");
	}
	public void test2()
	{
		System.out.println("test2:begin");
		Thread t2=new Demo();
		t2.start();
		System.out.println("test2:end");
	}
	public static void main(String[] args)
	{
		Test t=new Test();
		t.test1();
		t.test2();
	}
}

从test1的运行结果可以看出,线程t1是在test1方法结束后才执行的,“System.out.println("test1:end");”语句不用等待t1.start()执行完就可以执行了。因此,在test1中调用start()方法是异步的,所以main线程与t1线程是异步执行的。从test2的运行结果可以看出,调用t1.run()是同步的调用方法,因为System.out.println("test2:end");只有等t1.run()调用结束后才被执行。

posted @ 2019-03-05 14:13  测试开发分享站  阅读(156)  评论(0编辑  收藏  举报