在学习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()是线程任务的运行者。