多线程笔记
Tim Chen(motion$) Lv5

写在前面的话

  • Java中的多线程是一项非常重要的学习内容。多线程的引入强化了程序的执行能力,提高了程序的执行效率。那么多线程到底是神马呢?本文将更随毕向东老师的思路揭开多线程的谜底。
  • 本文笔记是除了在《毕向东Java基础》视频的基础上所做的笔记之外,还做深层的扩展。

多线程概念

认识进程

  • 在认识多线程之前,我们需要先了解“进程”这个概念。那么什么是进程呢?进程是操作系统的基础,它是程序的一次执行。即是程序完成的一次由开始到结束的执行过程。进程包括运行中的程序和程序所使用到的内存和系统资源,而一个进程又是由多个线程所组成的。
  • 参考:进程

认识线程

  • 那么什么又是线程呢?线程其实是进程当中的一个执行路径,它是进程中的一个独立的控制单元。每个进程都可以包含多个执行路径,每个进程必须包含一个线程,叫做进程的主线程。
  • 参考:线程

认识多线程

  • 多线程就是指一个进程中包含多个执行路径,即是在一个程序中可以同时运行多个不同的线程来执行不同的任务。最简单的例子就是JVM,JVM是一个多线程的进程,它启动之后不止一个线程,还包括了垃圾回收的线程。

为什么需要线程

  • 可以提高程序的运行效率
  • 可以优化程序的执行能力

多线程的实现(Java)

  • 查阅api文档,可以知道Java多线程的实现有2种方法。第一种是继承java.lang.Thread类;第二种是实现java.lang.Runnable接口。

继承java.lang.Thread类的多线程实现

  • 步骤:
    • 定义一个类,继承java.lang.Thread类
    • 复写Thread类中的run()方法,目的:将自定义的代码存储在run方法中,让线程运行。
    • 调用线程的start()方法,该类有2个作用:启动线程和调用run()方法。
  • 代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 定义一个类,继承java.lang.Thread类
class Demo extends Thread {
// 复写Thread类中的run()方法
public void run () {
for (int i = 0; i < 60; i++) {
System.out.println("demo run!------"+i);
}

}

}

public class ThreadDemo {
public static void main(String[] args) {
Demo d = new Demo();
// 调用线程的start()方法
d.start();
for (int i = 0; i < 60; i++) {
System.out.println("Hello World run!---------"+i);
}
}
}
  • 运行结果
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    demo run!------0
    demo run!------1
    demo run!------2
    Hello World run!---------0
    demo run!------3
    Hello World run!---------1
    demo run!------4
    Hello World run!---------2
    demo run!------5
    demo run!------6
    demo run!------7
    demo run!------8
    ....
    ....
    Hello World run!---------31
    demo run!------29
    Hello World run!---------32
    demo run!------30
    Hello World run!---------33
    demo run!------31
    Hello World run!---------34
    ...
    ...
    Hello World run!---------58
    Hello World run!---------59
  • 结果分析:发现每次运行的结果都不一样
    • (单核CPU)某个时刻只能执行一个线程
    • 不同的线程都在抢夺CPU的执行权,谁抢到谁执行
    • CPU做着快速的切换,所以看起来像是多个线程同时在运行
    • CPU的随机性,它想执行哪个线程,哪个线程才可以被执行

为什么要复写Thread类当中的run()方法呢?

为什么是调用start()方法而不是run()方法呢?

实现java.lang.Runnable接口的多线程实现

线程的运行状态

后记

参考链接

  1. 线程及多线程的作用-CSDN-blog
  2. java 如何实现多线程-CSDN-blog
  3. 黑马程序员-JAVA基础-多线程(上)-cnblogs
  4. 线程7种状态的相互转换
 评论