Java多线程(一)

目录

一、认识线程

1.1线程是什么

1.2为什么要有线程

1.3进程和线程的区别

1.4Java的线程和操作系统的关系

二、进程调度的基本过程

2.1pcb关于进程调度的属性

2.2进程调度


一、认识线程

1.1线程是什么

一个线程就是一个 "执行流", 每个线程之间都可以按照顺讯执行自己的代码,多个线程之间 "同时" 执行着多份代码。例如:

一家公司要去银行办理业务,既要进行财务转账又要进行福利发放还得进行缴社保
如果只有张三一个会计就会忙不过来,耗费的时间特别长。为了让业务更快的办理好,张三又找来两位同事李四、王五一起来帮助他,三个人分别负责一个事情,分别申请一个号码进行排队,自此就有了三个执行流共同完成任务,但本质上他们都是为了办理一家公司的业务。

此时,我们就把这种情况称为多线程,将一个大任务分解成不同小任务,交给不同执行流就分别排队执行。其中李四、王五都是张三叫来的,所以张三一般被称为主线程MainThread

1.2为什么要有线程

首先,"并发编程" 成为 "刚需"。

  • 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU资源.
  • 有些任务场景需要 "等待 IO", 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程

其次, 虽然多进程也能实现并发编程, 但是线程比进程更轻量.

  • 创建线程比创建进程更快.
  • 销毁线程比销毁进程更快.
  • 调度线程比调度进程更快.

1.3进程和线程的区别

  • 进程是包含线程的. 每个进程至少有一个线程存在,即主线程。
  • 进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间.例如:

比如之前的多进程例子中,每个客户来银行办理各自的业务,但他们之间的票据肯定是不想让别人知道的,否则钱不就被其他人取走了么。而上面我们的公司业务中,张三、李四、王五虽然是不同的执行流,但因为办理的都是一家公司的业务,所以票据是共享着的。这个就是多线程和多进程的最大区别。

  • 进程是系统分配资源的最小单位,线程是系统调度的最小单位

1.4Java的线程和操作系统的关系

线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用(例如 Linux 的 pthread 库).
Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装

二、进程调度的基本过程

2.1pcb关于进程调度的属性

1.状态

在进程的调度过程中会出现两种最常见的状态,一个是就绪状态,一个是阻塞状态。其中就绪状态指的是做好了随时在cpu上执行的准备,阻塞状态指的是进程还没有做好被调度的准备。

2.优先级

系统在给进程调度的时候,会根据先来后到的一些原则来决定时间分配的权衡,从而达到将系统资源调配给更重要的进程。

3.上下文

由于进程是轮着运行的而且一次运行不完,为了保证cpu在下一次运行的时候能够能够找到上一次的运行记录,这里就有了存档和读档的概念,也就是上下文。对于操作系统来说,上下文是寄存器进行存储,会将进程的数据保存到对应的pcb中。

4.记账信息

相当于是统计信息,会统计每个进程在cpu上都执行了多久,执行了多少指令。目的就是为了将每个进程都执行到。

2.2进程调度

在早期的操作系统中,进程的分配是直接分配物理地址的,在这种情况下当某一个进程挂掉的时候,会导致所有的进程都挂掉。

到了现在就引出了虚拟地址的概念,有了虚拟地址进程就有了独立性,每个进程都有自己的虚拟空间,一个进程无法直接访问或修改其他进程的虚拟空间,从而强化了系统的稳定性。

通过虚拟地址空间,将进程都隔离开了,但是有时候又需要进程产生联系和配合,这里就有了进程通信。进程通信的方式有很多大致分为两种,一种是基于文件、另一种是基于网络这两种方式的本质都是一样的,都是借助一个公共区域完成数据的交换。

你可能感兴趣的:(Java多线程,java,后端)