多线程的基本概念

程序

“程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件,比如:我们要启动酷狗听音乐,则需要执行酷狗对应的的可执行程序。当我们双击酷狗的可执 行程序后操作系统会将该程序加载到内存中,开始执行该程序,于是产生了“进程”

进程

执行中的程序叫做进程(Process),是一个动态的概念。其实进程就是一个在内存中独 立运行的程序空间 。如正在运行的写字板程序就是一个进程

  1. 进程是程序的一次动态执行过程, 占用特定的地址空间。
  2. 每个进程由 3 部分组成:cpu、data、code。每个进程都是独立的,保有自 己的 cpu 时间,代码和数据,即便用同一份程序产生好几个进程,它们之间 还是拥有自己的这 3 样东西,这样的缺点是:浪费内存,cpu 的负担较重。
  3. 多任务(Multitasking)操作系统将 CPU 时间动态地划分给每个进程,操作系 统同时执行多个进程,每个进程独立运行。以进程的观点来看,它会以为自己 独占 CPU 的使用权。

    线程

    一个进程可以产生多个线程。同多个进程可以共享操作系统的某些资源一样,同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据),所以线程又被称为轻量级进程(lightweight process)。

  4. 一个进程内部的一个执行单元,它是程序中的一个单一的顺序控制流程。

  5. 一个进程可拥有多个并行的(concurrent)线程。
  6. 一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的 变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。
  7. 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制, 这就使得通信更简便而且信息传递的速度也更快。
  8. 线程的启动、中断、消亡,消耗的资源非常少

线程与进程的区别

  1. 线程在进程中运行的。
  2. 一个进程可以包含多个线程。
  3. 不同进程间数据很难共享,而同一进程下不同线程间数据很易共享。
  4. 进程要比线程消耗更多的计算机资源。
  5. 进程间不会相互影响,因为它们的空间是完全隔离的。而进程中的一个线程挂掉将导致整个进程挂掉。
  6. 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
  7. 一个进程如果只有一个线程则可以被看作单线程的,如果一个进程内拥有多个线 程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。

什么是并发

并发是指在一段时间内同时做多个事情。当有多个线程在运行时,如果只有一个 CPU,这 种情况下计算机操作系统会采用并发技术实现并发运行,具体做法是采用“ 时间片轮询算 法”,在一个时间段的线程代码运行时,其它线程处于就绪状。这种方式我们称之为并发 (Concurrent)。

线程的执行特点

方法的执行特点

image.png

线程的执行特点

image.png

什么是主线程以及子线程

主线程

当 Java 程序启动时,一个线程会立刻运行,该线程通常叫做程序的主线程(main thread), 即 main 方法对应的线程,它是程序开始时就执行的。
Java 应用程序会有一个 main 方法,是作为某个类的方法出现的。当程序启动时,该方 法就会第一个自动的得到执行,并成为程序的主线程。也就是说,main 方法是一个应用的 入口,也代表了这个应用的主线程。JVM 在执行 main 方法时,main 方法会进入到栈内存,JVM 会通过操作系统开辟一条 main 方法通向 cpu 的执行路径,cpu 就可以通过这个路径来执行 main 方法,而这个路径有一个名字,叫 main(主)线
主线程的特点: 它是产生其他子线程的线程。 它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行

子线程

在主线程中创建并启动的线程,一般称之为子线程