进程&线程&协程
两种方法创建线程
Thread、Runable
Callable+Future(FutureTask)
线程启动
start():开启自定义线程,自定义线程实例调用native方法启动jvm线程,只能执行一次
run():执行业务代码,可重复执行,如果run之前不执行start业务代码将会使用主线程
线程终止
线程代码执行完成、线程执行代码异常
stop()、suspend()、resume() - 线程终止但不释放资源
合理:interrupt()设置线程中断标识位,使用线程的代码判断并结束任务
sleep()中断异常:InterruptException可唤醒
上下文切换 5000~20000时钟周期
只有等待synchronized 内置锁的线程为阻塞
ReentrantLock 类可重入锁为等待或超时等待状态·
线程调度
协同式线程调度
抢占式线程调度 - java抢占式
内核线程实现 1:1 - jvm hotspot 使用操作系统原生线程及调度
用户线程实现 1:N
混合线程实现 N:M
协程(用户线程)- 纤程Fiber(JDK19虚拟线程)
守护线程:支持型&调度工作(资源回收与调度、GC、支持工作线程)
join()方法:把指定线程加入到当前线程,直到加入线程执行完再执行当前线程(解决线程乱序执行)
锁-有序、可见、原子
synchornized内置锁:类、方法、同步代码块 - 加锁对象为同一个才生效(保证了可见性)
对象锁 - 类的对象实例的成员变量或方法
类锁 - 类或类成员变量上
volatile:最轻量的通信/同步机制(不是锁),保证线程与线程之间的变量同步(适用一个线程写,多个线程读)
等待&通知机制
wait() - 加锁(同步块中)
notify() - 加锁(同步块中),随机唤醒一个线程
notifyAll() - 加锁(同步块中),唤醒所有wait线程
CompleteableFuture - 实现任务编排