Thread调用run()和start()方法的区别

来源:互联网 发布:cf东东数据一键刷枪 编辑:程序博客网 时间:2024/06/02 02:35


下面是一道阿里在线笔试题目,要求给出程序的输出结果:

 class TaskBGThread extends Thread {    private int i=1;    public void run()    {        System.out.print("TaskBG" + i);        i++;               }}public class TaskThread implements Runnable {    private int i=1;    public void run()    {        System.out.print("Task" + i);        i++;           }    public static void main(String[] args) {        Runnable runner = new TaskThread();        Thread thTask1 = new Thread(runner);        thTask1.run();        Thread thTask2 = new Thread(runner);        thTask2.start();        Thread thTaskBG1 = new TaskBGThread();        thTaskBG1.start();        Thread thTaskBG2 = new TaskBGThread();        thTaskBG2.start();           }}

         乍一看,觉得thTask1.run();不起作用,因为启动线程不都是调用start()使线程处于就绪态,等待CPU调度么,等真正执行线程体run()方法是由JVM调用的;所以当时觉得thTask1.run();不会起作用。

但是程序输出结果是:Task1Task2TaskBG1TaskBG1

thTask1.run();起了作用,且输出是Task1。

 

下面看Thread直接调用run()和start()方法的区别:

        start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程。

        start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。

  

        run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用。通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容,run方法运行结束, 此线程终止, 而CPU再运行其它线程。

        run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码如果直接用run方法, 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

 

阅读全文
0 0
原创粉丝点击