Java教程

多线程[概述][java]

本文主要是介绍多线程[概述][java],对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

线程的概念

在说线程的概念之前我们先要引出程序和进程的概念

程序(Program):

为了完成特定的任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象

  • 程序的概念(简化版):一段静态的代码(静态的)

进程(Process):

是程序的一次执行过程,或者是正在运行的一个程序,是一个动态的过程

  • 一个进程有它自身的产生,存在,消亡的过程—也就是进程有它的生命周期
  • 进程的概念(简化版):一个正在运行的程序(动态的)

进程作为资源分配的单位(系统在运行时会为每个进程分配不同的内存区域)

  • 也就是在内存中为每一个进程都分配的一个独立的空间

线程(Thread):

进程可以进一步的细化为线程,是一个程序内部的一条执行路径

  • 线程的概念(简化版):程序内部的一条执行路径

  • 线程作为调度和执行的单位,每个线程拥有独立的运行栈(虚拟机栈)和程序计数器

    • 每个线程都拥有独立的运行栈(虚拟机栈)和程序计数器也就决定了线程切换的开销小
  • 一个进程中的多个线程共享相同的内存单元/内存地址空间(也就是共享了相同的堆空间和方法区)

单线程(传统进程):

如果一个进程同一时间只能执行一个线程的话,我们称这个进程是一个传统进程(也就是只支持单线程)

多线程(多线程进程):

若一个进程同一时间并行执行多个线程,我们就说是支持多线程的(也就是多线程进程)

  • main方法其实就是一个线程,也就是一条执行路径

内存区(大致分为五份)

  1. 方法区
  2. 堆内存
  3. 虚拟机栈(运行栈)
  4. 本地方法栈
  5. 程序计数器(PC寄存器)

注意事项:

  • 每个线程都会有一份独立的虚拟机栈和程序计数器(PC寄存器)

  • 每个进程都会有一份独立的方法区和堆空间

  • 一个进程中的每个线程共享这个进程的内存单元(方法区和堆空间)

  • 如果堆里面有一个变量,那么我们这个进程中的多个线程都可以对这个变量进行修改

  • 系统在运行时会为每个进程分配不同的内存区域,每个进程有独立的存储空间,这个存储空间中包含了 1.方法区,2.堆空间,3.本地方法栈,4.虚拟机栈(运行栈),5.程序计数器(PC寄存器),其中的堆空间和方法区会被这个进程中的所有线程共享,而虚拟机栈和程序计数器每个线程都会有独立的一份

  • 一个进程中的多个线程共享这个进程的方法区和堆空间,也就是一个进程中的多个线程从从同一个堆中分配对象,也就是说多个线程可以访问相同的变量和对象,这就使得线程之间的通信更加的简便,高效,但是多个线程操作相同的共享的系统资源可能就会带来安全上的隐患

    • 比如说:线程1先对这个对象进行操作还是线程2先对这个对象进行操作?
    • 又比如说:线程1现在在操作,但是这个时候如果线程2也过来操作怎么办?
    • 上面这些都是一些安全隐患(后面的线程同步会讲如何处理这些安全隐患)
  • 在后面我们会讲到JVM的时候会提到这个JVM的调优

    • 这里的jvm调优就是指的是针对我们的每个线程共享的区域去调优,也就是对方法区和堆空间区调优

单核CPU和双核CPU的理解(有助于我们更加深入的去理解多线程)

单核CPU:

单核CPU中的多线程是一种假的多线程

  • 在单核CPU中如果我们要完成多线程,如果我们遇到了三个线程执行问题,那么这个单核CPU会根据这几个线程的重要程度先执行一个线程一会,然后再换一个线程执行一会,然后又再会换一个线程执行一会,这时候这三个线程其实是并发的执行的而不是并行的执行的,是由于CPU的运行速率特别的快,看起来就像是同时执行的一样.也就是说这个时候我们说单核CPU中的多线程是一种假的多线程

多核CPU:

多核CPU中的多线程才是真正的多线程

  • 在多核CPU中如果我们遇到多线程的问题时,每个核就可以去干一件事,这个时候会大大提高执行的效率,所以我们说多核CPU中的多线程才是真正的多线程

  • 一个java应用程序java.exe至少有三个线程main()主线程,gc()垃圾回收线程,异常处理线程

    • 如果发生了异常,那么就会影响到主线程

并行和并发:

并行:

多个CPU同时执行多个任务

eg:多个人同时做不同的事

并发:

一个CPU(采用时间片)同执行多个任务

eg:秒杀

  • 如果我们很多人在同时秒杀一个商品,这个时候我们有很多人在同一时间点做了一件事,灭每个人要购买的操作就可以看做一个线程,这个时候CPU如果每个CPU都只执行一个线程肯定是不够的,这个时候我们就需要每个CPU去并发的执行多个线程

  • 单核CPU处理多线程是一种假的多线程,它是使用了并发的方式去处理多个线程

  • 多核CPU处理多线程有的时候是并行,有的时候也是并发的

    • 比如有很多线程同时需要执行的时候,这个时候虽然是多核CPU,但是也不够并行的去执行这多个线程,所以每个CPU也要去同时执行多个线程
这篇关于多线程[概述][java]的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!