分解
?任务分解
–不同的程序行为采用不同的线程执行
?数据分解
–多个程序对不同的数据块执行相同的操作
?数据流分解
–一个线程的输出作为另外一个线程的输入
Java传统的并发程序设计
?使用原生的Java并发支持,wait()、notify()、synchronized
–很难使用,容易导致程序结构混乱。–这些都是太低级别的API,容易导致性能问题–重新发明轮子太多。(经常需要发明类似BlockingQueue、ReadWriteLock之类的轮子)
java.uti.concurrent的目标
?并发程序设计简单化?提供基本的并发类
–包括Lock、Condition、Semaphore、Atomic等
?提供线程安全的数据结构
–ConcurrentLinkedQueue、ConcurrentHashMap
?提供了一些
常用的工具类
–Threadpool、Scheduler、barrier、latch、blockingqueue等
?提供Atomic
–为专家提供用于开发高级的lock-free算法
拜神
DougLeaDougLea-Mr.concurrency,当今世界上并发程序设计领域的先驱,著名学者。他是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的人,有点土。。。