有BlockingQueue及其相关的类,跟阻塞队列有关系。前面已经作过介绍
ConcurrentHashMap,ConcurrentLinkedQueue等,这些是相关集合的线程同步版本。
CopyOnWriteArrayList,也是一种并发用的容器,当咱们改变这个数组的时候,先复制一个副本,修改这个副本,再复制回去。这样就实现了读写分离,适用于读多写少的并发场景。
CountDownLatch,这个类适用于这种状况:多个线程同时工做,而后其中几个能够随意并发执行,但有一个线程须要等其余线程工做结束后,才能开始。
该类里面维护一个计数器,经过构造器传入一个初始的count,里面有两个经常使用方法,一个是cutDown(),将计数器的数值-1,还有await(),调用await()的线程将一直阻塞,直到里面的计数器值为0。
CountedCompleter,这是个java8新增的类,我也看不懂是干啥的,有兴趣的读者自行阅读Java文档:http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountedCompleter.html
CyclicBarrier,同步屏障。当有许多线程并发执行时,能够设置一个屏障,让全部线程执行到屏障时阻塞,直到最后一个线程运行到屏障时,才让全部线程继续往下执行。
DelayQueue,一个延迟阻塞队列,里面的对象只有在其到期的时候才能取走,不然阻塞线程。(以前第4期咱们探讨过ScheduleThreadPoolExecutor的时候,里面就有这个东西)
Exchanger,能够在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。
Executor一系列,跟线程池有关系。
ForkJoinPool,Fork/Join模式下的线程池。听说是对多核支持比较好。 html
Fork/Join框架,是java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每一个小任务结果后获得大任务结果的框架。java
工做窃取算法,是指某个线程从其余队列里窃取任务来执行。减小窃取任务与被窃取任务线程之间的竞争,一般会使用双端队列,分别从头部与尾部拿任务执行。优势是充分利用线程进行并行计算,减小了线程间的竞争。缺点是某些状况下仍是存在竞争,好比双端队列中只有一个任务。而且该算法会消耗了更多的系统资源,好比建立多个线程和多个双端队列。算法
FutureTask,是Future的实现,用于获取Callable和Runnable对象的执行状态、结果等。 api
FutureTask除了实现Future接口外,还实现了Runnable接口。所以,FutureTask能够交给Executor执行,也能够由线程直接执行(FutureTask.run())数组
还能够经过ExecutorService.submit()方法返回一个FutureTask,而后执行FutureTask.get()方法或FutureTask.cancel()方法。多线程
当一个线程须要等待另外一个线程把某个任务执行完后才能继续执行,此时可使用FutureTask并发
FutureTask的实现,也是经过内部静态类实现AbstractQueuedSynchronizer,队列同步器中的tryAcquireShared(int)和tryReleaseShared(int)方法,来检查和更新同步状态。oracle
FutureTask.get()方法会调用AQS.acquireSharedInterruptibly(int arg)方法,这个方法执行过程以下框架
1)调用AQS.acquireSharedInterruptibly(int arg)方法,这个方法首先会回调在子类Sync中实现的tryAcquiredShared()方法来判断acquire操做是否能够成功。能够成功的条件:state为执行完成状态RAN或已取消状态CANCELLED,且runner不为nulldom
2)若是成功则get()方法当即返回,若是失败则到线程等待队列中去等待其余线程执行release操做
3)当其余线程执行release操做(好比FutureTask.run()或FutureTask.cancel(...))唤醒当前线程,当前线程再次执行tryAcquireShared()将返回正值1,当前线程将离开线程等待队列并唤醒它的后继线程(这里会产生级联唤醒的效果)
4)最后返回计算的结果并抛出异常
Phaser,是jdk7新增的一个线程同步工具,跟CountDownLatch和CyclicBarrier有些功能是重复的。
Semaphore,就是OS课上学过的信号量,用于控制一个资源可同时被几个线程访问。
SynchronousQueue,是一种队列,这种队列能够用来模拟生产-消费者模型,由于它的元素入队以后要想再入队必须等候一个出队操做。
ThreadLocalRandom,一个线程同步的随机数生成器,在高并发下生成随机数比Random快。
大体就这些了,还有一些类都是与之相关的。
还有两个子包atomic和locks,其中atomic是对一些数的再封装,保证在多线程下这些数的操做都是原子性的。(例如普通的i++
就不是原子的)locks里面则是提供了各类线程同步锁,其中ReentrantLock比较经常使用。
上面说的都比较泛,若是真的要深度解析java.util.concurrent包中的每个类,恐怕十篇博文都不够。