run()和start()的区别

在学习run()和start()方法之前,你需要了解Runnable接口和Tread对象的区别和作用是什么。可以参考我的博文Runnable和Thread的区别。
还是简单介绍一下Runnable接口和Thread对象吧。
实现了Runnable接口的对象并不是线程,它只是任务。Thread对象才是真正的线程创建者。也就是说,任务和线程是分开的,任务放在线程里面才会被执行。
简单的事例:

public class ThreadDemo {

    public static void main(String[] args) {
            RunnableThread runnableThread = new RunnableThread();
            runnableThread.run();
            runnableThread.run();
            runnableThread.run();
            runnableThread.run();
    }
}
public class RunnableThread implements Runnable{

    private int count = 10;
    @Override
    public void run() {
        while(count>0){
            System.out.println(Thread.currentThread().getName() + "-------" + count--);
        }
    }

结果:

main——-10
main——-9
main——-8
main——-7
main——-6
main——-5
main——-4
main——-3
main——-2
main——-1

这里就有一个主线程main,这也印证了我上面提到的——实现了Runnable接口的对象只是任务,它定义了线程所要执行的任务,是任务的定义者,并不是线程。而在此任务中,run()方法才是任务的实际运行者,main只有调用run()方法才能执行任务。
来说说start()方法:

    public static void main(String[] args) {
        RunnableThread runnableThread = new RunnableThread();
        //new Thread(Runnable target)创建一个新的Thread对象
        new Thread(runnableThread).start();
        new Thread(runnableThread).start();
        new Thread(runnableThread).start();
        new Thread(runnableThread).start();
    }

结果:

Thread-1——-10
Thread-1——-8
Thread-1——-7
Thread-2——-9
Thread-2——-6
Thread-2——-4
Thread-1——-5
Thread-1——-1
Thread-2——-3
Thread-0——-2

这里显示了3个线程Thread-0、Thread-1和Thread-2,Thread-3由于CPU运行速度太快没有显示出来。我们通过将Runnable接口的实例传入Thread对象中,来创建线程。所以我们得出Thread对象才是真正的线程创建者。而由Runnable接口实例创建的线程会处理同一资源。start()方法将线程启动并初始化,使线程处于就绪状态。当CPU调度此线程时,就会进入运行状态,执行run()方法。
由此总结出2句话:
start()是线程的启动者。
run()是线程任务的运行者。

你可能感兴趣的:(多线程)