Thread类和synchronized关键字太底层。属于Java语言内置的支持。
Java5在java.util.concurrent包和子包中添加了并发工具(Concurrency Utility)
在这种包中设计这些类型是为了更好地替代Java内置的线程和同步特性。
原子变量,Executor:Callable和Future。
24.1 原子变量
|
java.util.concurrent.atomic包中提供了这些类:AtomicBoolean,AtomicInteger,AtomicLong和AtomicReference。
原子操作方法:addAndGet,decrementAndGet,getAndIncrement,incrementAndGet。
24.2 Executor和ExecutorService
|
无论什么时候,都应该尽可能不要用java.lang.Thread线程来执行Runnable任务,而应该用java.util.concurrent.Executor或者它的子接口ExecutorService的一个实现来执行Runnable任务。
Executor:
void execute(java.lang.Runnable task)
ExecutorService是Executor的一个扩展,添加了终止方法和执行Callable的方法。
Callable和Runnable相似,只不过它可以返回一个值,并且便于通过Future接口来完成删除的任务。
一般来说不需要自己编写Executor(或者ExecutorService)接口的实现,而是利用Executors类(一个工具类)中定义的其中一个静态方法来得到它。
public static ExecutorService newSingleThreadExecutor()
包含单个线程的Executor。
public static ExecutorService newCacheThreadPool()
返回一个Executor,当提交的任务越来越多时,这个Executor就会创建更多的线程。(在内存不足时还创建新的进程,就很可能导致内存不足)
public static ExecutorService newFixedThreadPool(int numOfThreads)
确定返回的Executor中要保持多少线程。
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable(){
@Override
public void run(){
//执行一些相关的操作
}
}
);
24.3 Callable和Future
|
Callable是并发工具中最有价值的成员之一。Callable是一项任务,它返回一个值,并且能抛出一个异常。Callable和Runnable类似,只不过后者不能返回值或者抛出异常。
Callable定义了一个call方法:
V call() throws java.lang.Exception
可以将一个Callable传递给ExecutorService的一个submit方法:
Future<V> result = executorService.submit(callable);
submit方法返回一个Future,它可以用来取消任务,或者获取Callable的返回值。
要想取消一项任务,可以调用Future对象中cancel方法:
boolean cancel(boolean myInterruptIfRunning)
为了得到Callable的结果,可以调用相应Future的get方法。
V get()会阻塞,直到任务完成
V get(long timeout, TimeUnit unit)时间单位
Future:
booleanisCancelled()
boolean isDone()
24.5 锁
|
Lock接口。
aLock.lock();
try{
//利用锁定的资源完成一些操作
}finally{
aLock.unlock();
}
boolean tryLock()
boolean tryLock(long time,TimeUnit timeUnit)
API中的类和接口是要用来代替Java中比较低级的线程机制,例如Thread类和修饰符synchronized。