start()
start() 函数 API 定义:
使该线程开始执行,Java 虚拟机调用该线程的 run 方法。结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
start() 函数启动线程执行以下任务:
- 它统计了一个新线程
- 线程从 New State 移动到 Runnable 状态。
- 当线程有机会执行时,它的目标
run()
方法将运行。- start() 方法不能多次重复调用,否则抛出 java.lang.IllegalStateException 异常;
小结:
start()
函数用来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面的代码;通过调用 Thread 类的 start()
方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此 Thread 类调用方法 run()
来完成其运行操作的, 这里方法 run()
称为线程体,它包含了要执行的这个线程的内容。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。
run()
run() 函数 API 定义:
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。Thread 的子类应该重写该方法。
run() 函数启动:
线程类的
run()
方法是 Runnable 接口的一个抽象函数,由 java 虚拟机直接调用的,不会创建的新线程。所以可以被多次调用,因为它只是一个抽象函数。
小结:
run() 函数只是类的一个普通函数而已,如果直接调用 run 方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待 run 方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。