[J2SE 5.0专题][4.2]并发工具包

类别:Java 点击:0 评论:0 推荐:

Doug Lea是Java并发编程的大拿,我想不少人都应该听说过那一本Concurrent Programming in Javatm
Design principles and patterns,几乎是学习Java并发编程必看的一本书。这回Doug Lea牵头的JSR-166在J2SE 5.0中引入的新的并发工具包绝对值得关注。

新引入的java.util.concurrent包,以及背后的实现和API使用完全可以写出一本书甚至几本书来,我想在这里我就避重就轻,挑两个简单的了解一下吧,有兴趣的朋友可以另外参考一些书籍和网上资料。

我打算拿来看一看的是Semaphore类和Executor接口。

Semaphore其实就像是一个通行证管理员,在一个设计好的环境,每个线程为了完成某件事情,都需要从管理员那里拿到一各通行证,然后去处理那件事,处理好以后,再把通行证还给管理员供其他线程使用。对一个比较极端的情况:只有一个通行证,这个时候同一时间之可能有一个线程去处理那件事,这就类似synchronized的实现方式了。Semaphore其实要比wait()或者synchronized要灵活得多。

来一点实际的代码片段:

private final Semaphore s = new Semaphore(1); // “只有一个通行证可用”
s.acquireUninterruptibly(); // “尝试获取一个通行证,直到取得为止”
// “拿着通行证去完成一件事...”
s.release(); // “归还这个通行证”

而Executor则是很好的抽象出一套线程执行框架,将具体的线程处理方式从我们的具体的代码中分离出来,在另一个地方实现具体的线程处理机制:如单线程,或者线程池等。Executor只声明了一个方法:

void execute(Runnable command)

同样来一段演示代码:

Executor e = new XXXExecutor(); // 假想的Executor实现类
e.execute(new Runnable() {...} );
e.execute(new Runnable() {...} );

具体这个Runnable实例最终在怎样的线程环境和以怎样的方式被执行,完全由Executor的实现类XXXExecutor决定,而非写死到这段代码中。

有关更详细的Java并发编程,参考java.util.concurrent包和Doug Lea的主页。

本文地址:http://com.8s8s.com/it/it12197.htm