CompletionService简介(异步)mingxing - 牛牛娱乐

CompletionService简介(异步)mingxing

2019-02-10 10:35:33 | 作者: 鸿熙 | 标签: 办法,成果,供给 | 浏览: 4342

一.CompletionService接口供给了能够操作异步使命的功用,其仅有完结的API为ExecutorCompletionService。此API仅仅能够获取异步使命履行的成果,它不是ExecutorService。

其有5个中心办法

Future V poll():同步操作,获取并移除榜首现已完结的使命,不然回来null。 Future V poll(timeout):同步操作,获取并移除榜首个现已完结的使命,堵塞时刻为timeout,不然回来null;支撑InterruptedException。 Future V submit(Callable V task):提交使命,并获取使命履行成果的句柄。 Future V submit(Runnable,V result):提交使命,并获取使命履行成果的句柄。 Future V take():获取并移除榜首个履行完结的使命,堵塞,直到有使命回来。支撑InterruptedException。

 ExecutorCompletionService之说以能够供给此功用,原因就是其内部持有一个BockingQueue(此queue能够经过结构器传入指定)。

一起这还要凭借Future/FutureTask的功用。

public ExecutorCompletionService(Executor executor,BlockingQueue Future V completionQueue):需求指定一个现有的executor和用于存储Future的行列,尔后经过submit提交的使命都将有executor来履行,并将"Future句柄"添加到行列中;这个API很像一个"润饰者".

二.Future:供给了能够检查异步履行的成果。此接口供给了多个便利的办法,以便检测和操控使命的操作。

boolean cancel(boolean interruptIfRunning):企图撤销使命的履行,假如使命现已完结或许撤销,此操作将无效。假如使命没有发动(start),那么使命将不会被履行,假如使命正在履行,则interruptIfRunning参数决议是否中止使命线程(线程需求相应“中止”)。此办法回来后,isDone将回来true;假如办法撤销成功,则isCancelled()则回来true。 V get():等候并获取履行成果。此办法会堵塞,知道成果回来。此办法会在线程中止时抛出InterruptException,假如使命被撤销,将;抛出反常。 V get(timeout):堵塞指定的时刻。假如时刻超时,仍未能履行完结,则抛出timeoutException。

RunnableFuture接口扩展了Future接口和Runnable,只供给(掩盖)run()办法,其效果十分简略,就是标明其子类具有可履行run办法,且获取Future成果。

三.FutureTask就是RunnableFuture的子类,具有Future接口的可撤销使命的才能,以及获取异步计算成果的才能。FutureTask能够认为是一个runnable和callable使命的桥梁类,其结构函数能够承受这两种使命。

FutureTask(Callable V callable)  FutureTask(Runnable runnable, V result):当运转完毕后,将回来指定的result。

 此外,还有几个特别的办法:

protected void done():可重写的办法,当使命履行完毕后,将会调用此办法履行额定的操作。 protected void set(V v):会被run办法内部调用,用来设置履行成果,此成果能够经过get获取。

runnable类型的使命,会在FutureTask中转化成Callable(拜见Executors.callable(runnable,result),原理很简略,创立一个Callable实例,即在调用call时刻接的调用run(),

并在履行完毕后,回来指定的result)。

 

四.ExecutorCompletionService:提交给ExecutorCompletionService的使命,会被封装成一个QueueingFuture(一个FutureTask子类),此类的仅有效果就是在done()办法中,增加了将履行的FutureTask加入了内部行列,此刻外部调用者,就能够take到相应的履行完毕的使命。(take就是从blockingQueue中顺次获取)

 

 

public class ExcutorComplementServiceTest {
 * @param args
 public static void main(String[] args) throws Exception{
 Executor executor = Executors.newFixedThreadPool(3);
 CompletionService Integer cs = new ExecutorCompletionService Integer (executor);
 //List Future Integer result = new ArrayList Future Integer (10);
 for(int i=0; i i++){
 cs.submit(new Callable Integer () { 
 @Override
 public Integer call() throws Exception {
 Random r = new Random();
 int init = 0;
 for(int i = 0; i i++){
 init += r.nextInt();
 Thread.sleep(100);
 return Integer.valueOf(init);
 for(int i=0; i i++){
 Future Integer future = cs.take();
 if(future != null){
 System.out.println(future.get());                          
			
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表牛牛娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章