在JavaSE5中,JUC(java.util.concurrent)包出现了
在java.util.concurrent包及其子包中,有了很多好玩的新东西:
1、执行器的概念和线程池的实现。Executor、ExecutorService框架
从Executor接口开始,到ExecutorService,再到很多基于ThreadPoolExecutor实现的具体执行器。执行器实际上是采用了一种叫做命令模式的设计,将任务Runnable和具体执行线程相分离,并给出了生命周期等管理方法,一般只要execute一个Runnable任务即可。未能及时执行的任务放在一个队列中等待执行,这又是一种Producer & Customer模式。线程池的实现,则可以更方便地管理执行的线程,如重用线程,并限定线程所占资源上界,比起直接Thread的简陋用法更有实用更方便更有效率。
2、Callable、Future。
前者使得提交线程有返回结果变成可能(Runnable的run()是void的),后者则对任务的生命周期控制更为直接。和CompletionService结合起来用更灵活。
3、原子类。
原子类的很多操作能够保证原子性,不保留中间状态,可以高效解决很多线程安全问题。需要注意的是,虽然java.util.concurrent.atomic包中有AtomicInteger、AtomicLong和AtomicReference等,但却没有AtomicDouble和AtomicFloat,这个需要自己实现。Sun的JDK原子类的操作很多是基于sun.misc.Unsafe的(此类并未随Jdk源码一起开放)。
4、锁机制。
java.util.concurrent除了atomic子包外,还有一个locks的子包。除了Java平台固有的synchronized对象锁机制,JavaSE5中的并发包用Java代码重新实现了一套锁机制,而这些很多都是基于前面提到的Unsafe类的原子操作。AbstractQueuedSynchronizer是这个体系中重要的抽象类。在JUC锁的实现体系中有和synchronized内在锁对应的Lock实现以及和监视器模型中wait()和notify()/notifyAll()对应的Condition类及其awati()和signal()/signalAll()。至于后者的特点,后续文章详谈。
5、并发容器类和其它工具类。
前面的容器没有在并发角度上做太多考虑,那么在并发情况下,JUC给我们带来的好东西就是更加实用的CopyOnWriteArrayList、ConcurrentHashMap以及BlockingQueue的各类实现。除此之外,CountDownLatch、CyclicBarrier、Semaphore、Exchanger都是很实用的并发工具类。
6、Fork/join框架
7、TimeUtil工具
这个可以使用google的quart包里的工具代替