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


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

 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方法, 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

猜你喜欢

转载自blog.csdn.net/ljheee/article/details/78512815