而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。
举例说明一下:
记住:线程就是为了更好地利用CPU,
提高程序运行速率的!
public class Test {
public static void main(String[] args) {
Runner1 runner1 = new Runner1();
Runner2 runner2 = new Runner2();
// Thread(Runnable target) 分配新的 Thread 对象。
Thread thread1 = new Thread(runner1);
Thread thread2 = new Thread(runner2);
// thread1.start();
// thread2.start();
执行结果:通过下面的打印结果可以看出两个线程在同时执行,争取cpu,无需等待run方法体代码执行完毕而直接继续执
行下面的代码
进入Runner2运行状态==========0
进入Runner1运行状态——————————0
进入Runner2运行状态==========1
进入Runner1运行状态——————————1
进入Runner2运行状态==========2
进入Runner1运行状态——————————2
进入Runner2运行状态==========3
进入Runner2运行状态==========4
进入Runner2运行状态==========5
进入Runner2运行状态==========6
进入Runner2运行状态==========7
进入Runner2运行状态==========8
进入Runner2运行状态==========9
进入Runner1运行状态——————————3
............
thread1.run(); thread2.run();
执行结果:可以看出,调用直接调用run方法,相当于调用普通的方法。
程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码
进入Runner1运行状态——————————0
........中间都是runner1在执行
进入Runner1运行状态——————————99
进入Runner2运行状态==========0
.........中间都是runner2在执行
进入Runner2运行状态==========99
}
}
class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("进入Runner1运行状态——————————" + i);
}
}
}
class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("进入Runner2运行状态==========" + i);
}
}
}
注意:这里有个误区,有好多人看完api文档之后都以为run()是不会单独执行的,直接调用run()什么也不会返回,其实并不是,希望
看完上面的内容能更好的理解两方法的区别。