- java.util.concurrent.atomic
- java.util.concurrent.locks
- Executors # 线程池工厂
- 策略
- 1 创建并设置
- 2 execute()时
- 1 线程数小于corePoolSize, 创建线程并执行
- 2 线程数大于或等于corePoolSize, 任务入队列
- 3 队列满,线程数小于maximumPoolSize, 创建线程并执行
- 4 队列满,线程数大于maximumPoolSize, 抛出异常
- 3 线程完成任务,从队列取任务执行
- 4 线程空闲,超过keepAliveTime, 运行线程大于corePoolSize, 线程停掉
- newFixedThreadPool(3) # 固定数量
- ExecutorService Pool = Executors.newFixedThreadPool(2);
- pool.execute(new MyRunnable())
- pool.shutdown()
- newCachedThreadPool() # 根据情况创建数量
- newSingleThreadExecutor() # 数量为1
- newScheduledThreadPool(2) # 延时
- ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
- Thread r1 = new MyRunnable();
- pool.execute();
- pool.schedule(r1, 10, TimeUnit.MILLISECONDS); # t1在10秒后执行
- pool.shutdown();
- <<ExecutorService>> - execute(Runnable)
- submit(Runnable) # 返回Future
- invokeAny() # 返回执行最快的一个结果
- invokeAll() # 所有执行结束后返回
- shutdown() # 只interrupt()空闲线程
- shutdownNow() # interrupt()所有线程
- ThreadPoolExecutor
- corePoolSize # 最小数量
- maximumPoolSize # 最大数量
- keepAliveTime # 线程空闲等待时间
- <<ScheduledExecutorService>> - schedule(r1, 10, TimeUnit.MILLISECONDS) # 10秒后执行
- scheduleAtFixedRate(r1, 1, 2, TimeUnit.MILLISECONDS) # 1秒后执行,2秒一次,间隔计算开始时间。异常直接关闭
- scheduleWithFixedDelay(r1, 1, 2, TimeUnit.MILLISECONDS) # 同上,间隔计算结束时间
- ScheduledExecutorPoolService
- ForkJoinPool # java7
- ForJoinPool(4) # 并行级别
- invoke()
- RecursiveAction # 没返回值
-
MyRecursiveAction extends RecursiveAction {
@Override
protected void compute() {
new MyRecursiveAction().fork()
}
}
- RecursiveTask # 有返回值
-
MyRecursiveTask extends RecursiveTask<Long> {
@Override
protected Long Compute() {
MyRecursiveTask t1 = new MyRecursiveTask()
t1.fork()
retrun t1.join()
}
}
- CopyOnWriteArrayList
- <<BlockingQueue>> # 锁实现,插入和取值阻塞, 不能插入null - add() # 抛异常
- offer() # 超时退出,返回特殊值
- put() # 阻塞
- remove() # 抛异常
- poll() # 超时退出,返回特殊值
- take() # 阻塞
- element() # 检查,抛异常
- peek() # 返回特殊值
- ArrayBlockingQueue # 固定大小
- size()
- o→
- queue.put(new PoisonPill()) # 毒丸, 标志数据取完
- obj.isPoisonPill()
- LinkedBlockingQueue # 链式
- 两个ReentrantLock(可重入锁)分别控制元素入队和出队
- tomcat用TaskQueue的父类,它重写offer方法减少创建多余线程
- PriorityBkockingQueue # 无界,排序
- 一个独占锁控制入队和出队, 通过cas(无锁算法)保证同时只有一个线程扩容成功
- DelayQueue # 无界, 延迟期满才能提取。内部用PriorityQueue实现
- SynchronousQueue # 单元素, cas实现
- ConcurrentQueue
- add()
- offer()
- poll()
- peek()
- ConcurrentLinkedQueue # 无界队列, 使用cas
- isEmpty()
- size()
- remove()
- contains()
- ConcurrentHashMap
- 并发集合通过复杂的策略提高效率, 用ReentrantLock
- 加了concurrencyLevel属性,决定锁分段个数,取2的次幂。内部用分段锁技术,每段Segment中再存放Entity[]数组
- ConcurrentSkipListMap # 非阻塞Hash跳表, 功能同TreeMap,线程安全,用跳表实现