8.1 线程简介

1 、多任务

  • 现实生活中多件事一起作。

  • 在程序中是指在一个系统中可以同时进行多个进程,即有多个单独运行的任务,每一个任务对应一个进程。

  • 每一个进程都有一段专用的内存区域,即使是多次启动同一段程序产生不同的进程也是如此。

2、多线程

  • Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

  • 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。

  • 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

  • 主线程和子线程交替执行

3、程序、进程、线程

  • 程序

    • 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。

  • 进程

    • 一个应用程序(1个进程是一个软件)

    • 是执行程序的一次执行过程,是一个流动的概念。是系统资源分配的单位。

    • 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。

  • 线程

    • 一个进程中的执行场景/执行单元。

    • 线程是CPU调度和执行的单位。

    • 一个线程不能独立的存在,它必须是进程的一部分。

  • 注意:

    • 一个进程可以有多个线程

    • 线程是独立的执行路径。

    • 在程序与运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程

    • main()称为主线程,为系统的入口,用于执行整个程序;

    • 在一个进程中,如果开辟了多个进程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为的干预的。

    • 对于同一份资源操作,会存在资源抢夺的问题,需要加入并发控制。

    • 线程会带来额外的开销,CPU的调度时间、并发控制开销。

    • 每一个线程在自己的工作内存交互,内存控制不当会造成数据不一致。

8.2 线程创建

  • 三种创建方式:

    • Thread class 继承Thread类

    • Runnable接口 实现Runnable接口

    • Callable接口 实现Callable接口

8.2.1 Thread类

  1. 创建一个新的执行线程的方法,将一个声明为Thread的子类。

  2. 自定义线程类继承Thread类

  3. 重写run()方法,编写线程执行体

  4. 创建线程对象,调用start()方法启动线程。

  5. 注意:

    • 线程开启不一定立即执行,由CPU调度执行

    • 启动线程:子类对象.start()

    • 不建议使用,为了避免OOP单继承的局限性

  6. 实例

    package Demo032;

    /**
    * @Author: H-YONG-8
    * @DATA: 2023/4/20
    * JavaSE
    * 创建多线程 继承Thread类
    */
    public class TestThread1 extends Thread{
       @Override
       public void run() {
           for (int i = 0; i < 20; i++) {
               System.out.println("我在看代码-----"+i);
          }
      }

       public static void main(String[] args) {
           //main 主线程

           //创建一个线程对象
           TestThread1 testThread1 = new TestThread1();

           //调用start()方法开启线程
           testThread1.start();
           for (int i = 0; i < 20; i++) {
               System.out.println("我在学习多线程---"+i);
          }
      }
    }

    //多条执行路径,主线程和子线程并行交替执行

    执行结果:
    我在学习多线程---0
    我在看代码-----0
    我在学习多线程---1
    我在看代码-----1
    我在学习多线程---2
    我在看代码-----2
    我在看代码-----3
    我在学习多线程---3
    我在看代码-----4
    我在看代码-----5
    我在学习多线程---4
    我在学习多线程---5
    我在看代码-----6
    我在学习多线程---6
    我在看代码-----7
    我在学习多线程---7
    我在看代码-----8
    我在学习多线程---8
    我在看代码-----9
    我在学习多线程---9
    我在看代码-----10
    我在学习多线程---10
    我在学习多线程---11
    我在学习多线程---12
    我在学习多线程---13
    我在学习多线程---14
    我在学习多线程---15
    我在学习多线程---16
    我在学习多线程---17
    我在学习多线程---18
    我在学习多线程---19
    我在看代码-----11
    我在看代码-----12
    我在看代码-----13
    我在看代码-----14
    我在看代码