Java多线程相关知识
2022-02-10 10:49:27 1 举报
Java多线程相关知识
作者其他创作
大纲/内容
进程表
JDK1.5
超时等待time_waiting
JVM使用线程模型为TLK模型每一个线程在内核中都会有相应的线程表做记录进行维护
线程表
添加失败
插入失败
判定是否插入阻塞队列成功
新建状态new
Object.notify()Object.notifyAll()LockSuppor.unpark()
判断线程池中工作线程数是否大于核心线程数
已经饱和
插入成功
线程
终结terminable
小于
AbortPolicy默认策略:抛出异常
判断添加到阻塞队列中是否成功
等待队列
细化流程
核心线程数是否用完
pthread操作系统维护
拒绝策略
产生调整优化需求Doug Lea写了AQS相关功能
ThreadPoolExecutor的执行过程
主线程
监听等待队列中是否有任务
判断提交的线程是否为空
判断当前线程池状态是否为Running
是
偏向锁单个线程访问
进程2
Object.wait()Thread.join()LockSuppor.park()
判断当前工作中线程数量是否饱和
线程模型
提交任务
进程1
用户空间
java线程状态转换流程
ReadWriteLock
运行Runable
OS->Mutex互斥量(竞争激烈)阻塞未获取到moitor的线程
new:创建Runnable:运行Blocked:阻塞WAITING:等待Time_waiting:超时等待terminable:终结
synchronized
等待进入synchronized方块等待进入synchronized方法
线程多次自旋不能获取锁
Thread.start()
AQS相关功能
否
添加成功
线程数是否已经达到最大线程数
超过一个线程访问
task
java对象new Object
将任务添加到任务队列中
执行饱和策略
获取到锁
ThreadPoolExecutor线程池线程任务执行流程
系统调度yield()
就绪Ready
DiscardOldestPolicy丢弃最久的未处理任务
thread
移除成功
核心线程
系统调度
1.先进行线程核心线程判定创建
运行running
synchronized的基本升级过程
ReetrantLock
移除失败
TLK模型
最大线程数
判断线程池状态是否为RUNNING
等待waiting
DiscardPolicy丢弃当前任务
ReentrantReadWriteLock.ReadLock
线程池Executors
jdk1.6
创建非核心线程并执行任务
因为效率低
JDK版本
ReentrantReadWriteLock.WriteLock
jdk=1.6
内核空间
将提交的线程插入到阻塞队列中
ULK模型
任务队列是否已经满了
抛出空指针异常throw new NullPointerException();
添加空线程到等待队列
结束运行
创建核心线程并执行任务
插入失败执行拒绝任务
Thread.sleep(long)Object.wait(long)Thread.join(long)LockSuppor.parkNanos()LockSuppor.parkUntil()
阻塞blocked
阻塞队列中移除当前线程
execute(Runnable)
轻量级锁
非核心线程
大于
monitor监控
0 条评论
下一页