多线程
线程池 分配 threads= cores/1-blockingCoefficient。
corePoolSize = Cpu 数 +1 (计算性密集型的操作)
cpu执行时间:a
等待时间:b
线程数取值: k*核心数*(a+b)/a
k超线程 1.5 或者 2 ,a,b的值由压测得出
线程队列取值 :核心数 * 容忍的等待时间 * (a+1.5b)/(a+b)
-Xss (默认 1M) ,如果有很多递归操作 可以增加 5M ,10M ,同时考虑 内存 的大小
请求来了,当核心线程数 满了, 先进入队列,等队列满了之后再创建到最大线程数
Semaphore
LinkedBlockingQueue 无界队列
SynchronousQueue 直接提交,如果超过最大线程数,再来线程给你的主线程 ,谁创建你就给谁,给父线程
! ArryayBlockingQuene 有界队列 , 一般用这个
最大线程数满了,执行策略:
AbortPolicy :直接抛出异常
CallerRunspolicy:重试添加当前的任务,他会自动重复调用execute()方法
DiscardOldestPolicy:放弃 最旧的来处理请求,执行新传入的任务
DiscardPolicy:不做任何操作,放弃
BlockingQueue 提倡的办法
Executor
实例 多线程 发送邮件,发送完成 主线程 监控
线程池的选择
CountDownLatch
latch.countDown()
ThreadLocal
InheritableThreadLocal
并发编程注意事项
1.线程名称设置
2.Atomic+ Atomic !=Atomic 2个原子操作相加不是原子操作
3.响应中断InterruptedException
相关概念
1.java并发性和多线程就介绍
2.深入理解java内存模型
3.同步和java内存模型
4.happens-before俗称
网站:并发编程网
书籍:java并发编程实践
浙公网安备 33010602011771号