Java多线程并发
多线程基础
基础概念
进程:
线程:
- 线程是操作系统能够进行运算调度的最小单位,包含在进程之中,是进程中的实际运作单位。
- 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
创建线程的方式
继承Thread类:
实现Runnable接口:
基于Callable和Future接口:
使用线程池:
线程的几种状态
新增、就绪、运行、阻塞、终止
线程执行机制
JVM中一个应用可以有多个线程并行执行,线程被一对一映射为服务所在操作系统线程,调度在可用的CPU上执行,启动时会创建一个操作系统线程;当线程终止时,这个操作系统线程也会被回收。
线程运行内存模型
Java虚拟机启动运行时,会创建多个线程,数据区中有的模块是线程共享的,有的是线程私有的
- 线程共享的有:堆(Heap)、方法区(元空间)
- 线程私有的是:程序计数器、虚拟机栈、本地方法栈
单个CPU在特定时刻只能执行一个线程,所以多线程通过几块空间的使用,然后不断的争抢CPU的执行时间段。
其他线程概念
- 线程优先级: 线程调度器倾向执行线程优先级高的线程,线程优先级高说明获取CPU资源的概率高,或者获取的执行时间分片多,即被执行的概率高,但优先级低的不代表一定最后执行。
- 守护线程: 守护线程是支持辅助型线程,主要在程序中起到调度和支持性作用,当JVM中非守护线程全部结束,守护线程也就会结束。如JVM中的
GC
线程就是一个守护线程。 - 线程加入: 线程A中,执行线程B的加入方法,那么A线程就会等待线程B执行完毕再返回继续执行。可使用
Thread.join()
加入一个线程。 - 本地线程:
ThreadLocal
也叫做线程本地变量,是变量在每个线程中创建的副本变量,每个线程可以访问自己内部的副本变量,线程之间不相互影响。