当前位置: 代码迷 >> 综合 >> JavaThread 01 多线程详解
  详细解决方案

JavaThread 01 多线程详解

热度:9   发布时间:2023-11-24 13:51:48.0

1.1 多线程详解


平时打游戏,为什么那么多人可以一块儿 打呢?为什么我跟你聊天,你也能跟我聊天呢。

  • 线程简介
  • 线程实现(重点)
  • 线程状态
  • 线程同步(重点)
  • 线程通讯问题
  • 高级主题

1.1.1 多任务

多任务(一心二用,三用… 边吃饭边玩手机)
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上是我们的大脑在同一时间依旧只做了一件事。<不信的话,你可以自己仔细想一想,是不是在做多个任务的时候,某一个瞬间你只在做一个事情。只是时间间隔的比较快。你察觉不到。>


1.1.2 多线程

  • 很窄的一条道路,有很多交通工具通过。就会出现很多奇怪的事情。
    在这里插入图片描述
  • 将道路拓宽或添加多个道路,并且划分各个区域。有规则的去行驶,通过。

在这里插入图片描述

原来是一条路,慢慢因为车太多了,道路堵塞,效率极低。还会出现各种问题。为了提高使用的效率,能够充分利用这些道路,于是加了多个车道。从此妈妈再也不用担心道路堵塞了。<这就是所谓的多线程,用来解决一条线程 执行事务堵塞,效率低的问题。>

  1. 举个游戏的多线程例子:两个人LOLsolo局,为什么以前只能一个人玩人机,而后来可以 玩匹配,可以人人玩呢?这就是因为服务器进行了多线程处理,将不同账号的数据运行在不同的线程中。

  2. 举个写程序的例子,以前我们在主方法 Main() 里面,如果想要实现一个比较庞大的方法,是不是就要去写个类,然后再里面写方法,再用 Main() 去调用这个类的方法。然后 再回到 Main() 方法,去执行Main()。这是其实整个过程你还是在一个线程上执行。(如果处理的东西过多,效率是会变低的。)

在这里插入图片描述

从上图 不难看出,其实你整个过程的操作,都是 主线程 执行的。

  • start() 方法调用子线程,让子线程去执行 run() 方法 ,效率瞬间会提高
    在这里插入图片描述

1.1.3 程序.进程.线程(关系)

在这里插入图片描述
也就是说,我们一直以来写的程序,都是低效率的!正常些程序,内部的模块代码,是需要 分配好各自的线程去执行的。

程序是我们写的一个可执行文件,存储在硬盘中!进程是当程序运行起来后加载到内存中的状态,叫做进程。线程是进程为了处理各种任务,而分配的出去的。通常进程刚创建,就会有个主线程用来开启所有线程和操作核心代码。在线程的世界中,是没有内存地址空间这码事的,因为它们用的都是 进程分配的内存地址空间!


1.1.4 Process && Thread

  • 说起进程,不得不说一下程序。程序是指令和数据的有序集合,其本身没有任何运行的概念年,它只是一个静态的存储。
  • 而进程则是程序执行后的状态,它是一个动态的概念。是系统资源自动分配的单位。
  • 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。而我们一直以来所学的 main 程序的入口,其实就是 主线程。所以 我们才说 一个程序必须要有 这个 入口,否则没什么意义。<线程也是 CPU调度和执行的单位。>

我们所谓的多线程,真的是多线程么?

答:很多的 多线程是模拟出来的!!真正的多线程其实是指有多个 CPU,即 多核处理,如:服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu其实也只能执行一个代码而已,只是切换的速度过快,所以 才有了同时执行的错觉!<不过 CPU 确实可以做到这个事,而且对于一些事务稍微多的程序,是完全可以应付的。>


1.1.5 核心概念

  • 线程就是独立的执行路径
  • 在程序运行时,即使没有自己创建的线程,后台也会多个线程,如主线程,gc线程
  • main() 称之为主线程,为程序的入口,用于执行整个程序。
  • 在一个进程中,如果开辟多个线程,线程的运行由调度器安排调度,调度器与操作系统紧密相关。先后顺序不能人为的干预!<因为这个调度器,是CPU硬件里的,不能人为干预。>
  • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制<并发控制是很重要的,当初我在自己学习研究的时候就是因为不知道 并发控制,而放弃了 多线程的学习!>

举例:一万个人买票,但现在票只有 100张。那么这一万个人肯定会有人 买不到票的!但是如果你不加入 并发进行控制。这些人就失去了道德观念,会疯狂的抢夺,甚至抢到的东西根本就不是票!拿到的数据 什么都有可能。而且 不是所有的内存地址 都接受你的访问的!这样乱枪,很容易报错和崩溃!


只有提供了 “并发控制”,才能够 让这些人正常,分配资源正常!(比如每个人都排好队,谁先来的,谁就能买到票。你后来的,压根就可以走了,你买不到票!

  • 线程会带来额外的开销,如CPU调度时间,并发控制开销
  • 每个线程在自己的工作内存交互,内存控制不当,会造成数据的不一致!<因为不在一个线程里了,所以多线程之间数据的通讯是个难点呀~>