线程
概念
- 线程是操作系统里的一个概念,虽然各种不同的开发语言如 Java、C# 等都对其进行了封装,但是万变不离操作系统。Java 语言里的线程本质上就是操作系统的线程,它们是一一对应的。
- 线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。同一个进程中的所有线程共享进程获得的主存空间和资源,但不拥有资源。线程具有:
- 线程执行状态(运行、就绪、等待、…);
- 当线程不运行时,有一个受保护的线程上下文,用于存储现场信息。所以,观察线程的一种方式是运行在进程内一个独立的程序计数器;
- 一个执行堆栈
- 一个容纳局部变量的主存存储区。
- 虽然在 Java 语言中创建线程看上去就像创建一个对象一样简单,只需要 new Thread() 就可以了,但实际上创建线程远不是创建一个对象那么简单。创建对象,仅仅是在 JVM 的堆里分配一块内存而已;而创建一个线程,却需要调用操作系统内核的 API,然后操作系统要为线程分配一系列的资源,这个成本就很高了,所以线程是一个重量级的对象,应该避免频繁创建和销毁
Java线程的发展历史
Java中的线程本质上对应到操作系统的线程的,因此其发展历史与操作系统线程的发展历史息息相关,这个可以参考文章Java并发编程:进程和线程之由来
与协程对比
- 协程是很早之前就有的概念,维基百科上还加上了纤程等概念导致理解起来很复杂。其实协程可以理解为协作式的线程,协作体现在程序主动交出控制权。
- 协程的优势:
- 节省资源,轻量,具体就是:
- 节省内存,每个线程需要分配一段栈内存,以及内核里的一些资源
- 节省分配线程的开销(创建和销毁线程要各做一次syscall)
- 节省大量线程切换带来的开销
- 与NIO配合实现非阻塞的编程,提高系统的吞吐
- 使用起来更加舒服顺畅(async+await,跑起来是异步的,但写起来感觉上是同步的)
- 节省资源,轻量,具体就是:
- 参考资料:
与进程对比
线程是进程的组成部分, 与同一个进程中的其他线程共享进程获得的主存空间和资源。