在讲这个问题以前引入一下多线程的小知识吧html
/*/windows系统中的应用程序来作说明 ,例如:扫雷程序,游戏进行的同时,能够同时记录分数,计算时间等. 其实一个应用程序就是一个可执行文件,中包含了一个或者多个进程,一个或者多个进程中包含了一个或者多个线程.java
public class Thread
extends Object
implements Runnable
线程 是程序中的执行线程。Java 虚拟机容许应用程序并发地运行多个执行线程。windows
每一个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每一个线程均可以或不能够标记为一个守护程序。当某个线程中运行的代码建立一个新 Thread
对象时,该新线程的初始优先级被设定为建立线程的优先级,而且当且仅当建立线程是守护线程时,新线程才是守护程序。安全
当 Java 虚拟机启动时,一般都会有单个非守护线程(它一般会调用某个指定类的 main
方法)。Java 虚拟机会继续执行线程,直到下列任一状况出现时为止:多线程
Runtime
类的 exit
方法,而且安全管理器容许退出操做发生。run
方法以外的异常。
额...走远了走远了并发
直接说吧spa
(1)start()方法是来自线程的,真正的实现了多线程的运行,而不用等到run()方法执行完毕以后再执行下面的代码段线程
经过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并无运行。
而后经过此Thread类调用方法run()来完成其运行操做的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,
而CPU再运行其它线程。
code
(2)而run()方法只是类中咱们本身定义的方法,是一种普通的方法,顺序执行,只有在执行完这一段代码以后才会继续执行下去htm
而若是直接用Run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径仍是只有一条,这样就没有达到写线程的目的。
下面举了一个小例子
代码段以下:
1 public class test_Run { 2 public static void main(String[] args) { 3 Runner1 r = new Runner1(); 4 // r.run();//这是方法调用,而不是开启一个线程 5 Thread t = new Thread(r);// 调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。 6 t.start(); 7 8 for (int i = 0; i < 100; i++) { 9 System.out.println("进入Main Thread运行状态"); 10 System.out.println(i); 11 } 12 } 13 } 14 15 class Runner1 implements Runnable { // 实现了这个接口,jdk就知道这个类是一个线程 16 public void run() { 17 18 for (int i = 0; i < 100; i++) { 19 System.out.println("进入Runner1运行状态"); 20 System.out.println(i); 21 } 22 } 23 }