ncy,当今世界上并发程序设计领域的先驱,著名学者。他是util.concurrent包的作者,JSR166规范的制定。图书著作《ConcurrentProgramminginJava:DesignPrinciplesandPatterns》。其”AScalableElimination-basedExchangeChannel”和”ScalableSynchronousQueues”两篇论文列为非阻塞同步算法的经典文章
Executors(一)
????这是一种任务分解。任务提供者和执行者在本线程内完成,或者交给专门的Executor去执行。Executor可以分为多种,或者允许指定运行策略任务提供者和执行者之间需要一种通讯机制,用于:
–––––等到任务执行结束(或者等待一段时间)取消任务等待时执行错误通知获取执行结果这种机制成为Future,这是一个很关键的概念,在并发程序中使用,能使程序清晰化,而且功能完备。在各种并发的库中均有提供类似的概念。
Executors(二)
?Executor用于执行所提交的任务
–interfaceExecutor{voidexecute(Runnablecommand);}
?ExecutorService生命周期管理,提供了Future返回和其他工具方法
–interfaceExecutorServiceextendsExecutor{voidshutdown();Future>submit(Runnabletask);}
?Executors提供静态工厂方法
–classExecutors{ExecutorServicenewFixedThreadPool(intnThreads){…}ExecutorServicenewCachedThreadPool(){…}//…manymore…}
Future(一)
?一种很常用并发程序设计的手段便是任务分解。TaskProvider分解任务,提交给Executor执行。TaskProvider和Executor之间需要一种通讯手段,这种手段的具体实现,通常叫做Future。Future通常包括get(阻塞至任务完成),cancel,get(timeout)(等待一段时间)等等。Futue也用于异步变同步的场景。
Future(二)
?Future的接口的接口
–classFuture
{booleanisDone();Vget();Vget(longtimeout,TimeUnitunit);voidset(Vv);voidsetException(Throwablet);}
Future(三)
?Future已经是一个很流行的线程间通讯工具类,在很多网络并发的库中均有使用,例如C++网络库ACE,apache的nio框架mina,VisualC++内置future关键字直接使用。?Future是一个很见的工具类,但他能够使得并发程序代码结构变动更清晰,使用灵活,可以以此发挥,创造高级的设计模式?不会使用Future的人,有点土。。。
BlockingQueue(一)
?常用的工具类,用于数据流分解?读取阻塞,插入阻塞(可选)?ArrayBlockingQueue
–FIFO,有上限
?LinkedBlockingQueue
–FIFO,可能有上限
?PriorityBlockingQueue
–按优先次序,无上限
?SynchronousQueue
–Rendezvouschannel
BlockingQueue(二)
interfaceBlockingQueueextendsQueue{booleanadd(Ee);booleanoffer(Ee);Epeek();Etake()throwsInterruptedException;Epoll(longtimeout,TimeUnitunit)throwsInterruptedException;intdrainTo(Collectionc);}
BlockingQueue(三)
?注意add、offer、put的语义差别,养成使用offer的良好习惯?注意peek、take、poll的语义差别,不要搞混了peek和take。?必要时候使用drainTo提高性能
定时器(一)
?传统的java.util.Timer
–每个Timer启动一个TimerThread–没有直接和线程池或者Executor结合–内部的TimerQueue性能不够好,也不适用于较大规模的Timer处理–精度只能到达毫秒级
定时器(二)
?ScheduledExecutorService
–extendsExecutorService,利用线程池执行调度任务–内部使用DelayQueue实现(一个阻塞队列和优先队列的结合)
interfaceScheduledExecutorServiceextendsExecutorService{ScheduledFuture>schedule(Runnablecommand,…);ScheduledFuture>sch