(四十五)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()调用结束后才被执行。