今天看了下java官网上关于concurrency库的教程,了解了下基本知识,在此记录下。
线程池
concurrency库中最重要的概念当然是线程池,java中线程池是封闭在Executor接口的实现中的。当我们想执行新的线程中,传统的方法是
new Thread(r).start()
但线程的创建与销毁会造成一定的资源与时间的消耗,设想一下在一个web服务器,如果对每一个新进来的请求都创建一个线程来处理,这样当线程一多,其调试、创建及其本身占用的资源会很严重,甚至有可能导致系统崩溃,利用线程池来管理线程则可以避免这种结果。
在java concurrency中提供了新的接口来供用户执行线程,主要包括如下三个:
Executor
ExecutorService
ScheduledExecutorService
而线程池则被封闭在这三个接口的实现里,根据这三个接口提供的不同的工厂方法可以创建不同的线程池。
Executor提供了一个execute方法来执行一个Runnable对象;ExecutorService则在此基础上提供了submit方法,此方法返回一个Future对象,用以监控线程状态并获得线程执行的结果;ScheduledExecutorService则提供了scheduleAtFixedRate等方法来重复执行某一个任务。
其它
除线程池之外还扩充了集合框架如BlockingQueue,ConcurrentMap等 ,并提供了Lock类来显示地添加锁。另外一个有趣的是其提供的原子变量。
假设我们有一个Counter类,为了保证其线程间同步,我们一般会这样写
class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
有了原子变量 后,我们可以这样写
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
public void decrement() {
c.decrementAndGet();
}
public int value() {
return c.get();
}
}
至于其它高级的特性如Fork/Join框架等,可以参考其它的资料。