在学习多线程之前,还是先来看看熟悉的单线程程序,如下所示。

    1. public class example01 {
    2. public static void main(String[] args) {
    3. MyThread myThread = new MyThread(); //实例化对象
    4. myThread.run(); //调用 MyThread 类的 run()方法
    5. while(true) { //该循环是一个死循环,打印输出语句
    6. System.out.println("main 方法在运行");
    7. }
    8. }
    9. }
    10. class MyThread{
    11. public void run() {
    12. while(true) { //该循环是一个死循环,打印输出语句
    13. System.out.println("MyThread 类的 run()方法在运行");
    14. }
    15. }
    16. }

    运行结果如下所示。
    QQ截图20200708140303.png
    从上图所示的结果可以看出,程序一直打印“MyThread 类的 run()方法在运行”,这是因为该程序是一个单线程程序,当调用 Mythread 类的 run()方法时,晕倒死循环,循环会一直进行。因此,MyThread 类的打印语句将永远执行,而 main()方法中的打印语句无法得到执行。

    如果希望上述代码块中两个 while 循环中的打印语句能够并发执行,就需要实现多线程。为此 JDK 提供了一个线程类 Thread,通过继承 Thread 类,并重写 Thread 类中的 run()方法便可实现多线程。在 Thread 类中,提供了一个 start()方法,用于启动新线程。线程**启动后,虚拟机会自动调用_ run()_方法,如果子类重写了,该方法便会执行子类中的方法。**接下来,通过修改上述代码块中的案例来演示如何通过继承 Thread 类的方法来实现多线程,如下所示。

    1. public class example02 {
    2. public static void main(String[] args) {
    3. Mythread mythread = new Mythread(); //实例化对象
    4. mythread.start(); //开启线程
    5. while (true) { //通过死循环打印语句
    6. System.out.println("main()方法在运行");
    7. }
    8. }
    9. }
    10. class Mythread extends Thread {
    11. public void run() {
    12. while (true) { //通过死循环打印语句
    13. System.out.println("MyThread 类的 run()方法在运行");
    14. }
    15. }
    16. }

    运行结果如下所示。
    QQ截图20200708142643.png
    从上图所示的运行结果可以看到,两个 wile 循环中的打印语句轮流执行了,说明该文件实现了多线程。为了更好的理解单线程和多线程的执行过程,接下来通过一个图例来分析一下单线程和多线程的运行流出,如下图所示。
    从上图可以看出,单线程的程序在运行时,会按照代码的调用顺序执行。而在多线程中,main()方法和 MyThread 类的 run()方法却可以同时运行,互不影响,这正是单线程和多线程的区别。