Java并发编程之线程(一)

来源:互联网 发布:做淘宝必须有团队 编辑:程序博客网 时间:2024/05/15 13:24

概念

  • 线程是一种轻量级的进程。
  • 线程优点
    • 多个线程拥有共享同一个地址空间和所有可用数据的能力。
    • 线程比进程更容易创建和销毁
    • 在大量计算和大量 I/O 处理过程中,多个线程能够加快程序执行速度。
    • 进程是独立的地址空间:通信比较麻烦。进程之间数据共享没有线程之间方便和高效

这里写图片描述

每个进程至少有一个线程,可以认为那个线程就是主线程。每个线程都要维护自己的一台寄存器与堆栈。那么什么叫维护自己的一套寄存器呢?物理寄存器只有一套,线程只有在内存中维护自己的一套寄存器。当线程运行时将内存中的值加载到物理寄存器。如果不运行则将寄存器中的值放入内存。通过自己的一套寄存器,避免使用cpu寄存器时产生冲突,将原来的数据覆盖掉,从而导致线程运行出现数据错误。

为什么要用线程?

  • 浏览器

    • 线程1显示图像
    • 线程2从网络接收数据
  • 文字处理器

    • 线程1显示图形
    • 线程2读取用户键盘输入
    • 线程3自动定时的保存文档

文字处理器案例 进程之间数据共享没有线程之间方便和高效,进程之间合作比较难,线程之间共享数据比较方便

线程的实现:完全在用户层实现

这里写图片描述

  • 把整个线程包放在用户空间中,内核对线程包一无所知。从内核角度考虑,就是单线程进程。
  • 优点:不需要上下文切换,不需要对内存高速缓存进行刷新,使得线程调度非常快。允许每个进程有自己定制的调度算法。
  • 问题:如何实现阻塞系统调用,使用阻塞调用会阻塞其他的线程。内核由于不知道线程的存在,通常会把整个进程阻塞到 I/O 完成。如果一个线程开始运行,那么该进程中的其他线程就不能运行,除非第一个线程自动放弃CPU。

线程的实现:在内核中实现线程

这里写图片描述

  • 此时不需要运行时系统,内核中有用来记录系统中所有线程的线程表。
    当一个线程阻塞时,内核根据其选择,可以运行同一个进程中的另一个线程或者运行另一个进程中的线程。
  • 优点:内核很容在线程阻塞时切换到另一个线程执行。内核线程不需要任何新的、非阻塞系统调用。
  • 问题:在内核中创建或销毁线程的代价比较大。进程创建问题,一个多线程进程创建新线程出现的问题。当信号到达时,应该有哪一个线程处理。JVM本身就是一个进程,如果用这种方式实现,会导致整个JVM阻塞。例如:当遇到一个IO操作时,整个JVM就会阻塞。使用这种方式时,在操作系统看来只有线程。

线程的实现:平衡折中

这里写图片描述

  • 使用内核线程,然后将用户级线程与某些或者全部内核线程多路复用起来。内核只识别内核线程,并对其进行调度。一些内核线程会被多个用户级线程多路复用。这一模型能够带来最大的灵活度。JVM使用的就是这种模型。
原创粉丝点击