现在的位置: 首页 > 综合 > 正文

《Java7程序设计》第24章 并发工具

2018年04月10日 ⁄ 综合 ⁄ 共 1803字 ⁄ 字号 评论关闭
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。









抱歉!评论已关闭.