java-使用CompletionService

1、使用队列来完成Executor的线程池管理。

2、CompletionService整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take和poll方法,在结果完整可用时获得这个结果。ExecutorCompletionService是实现CompletionService接口的一个类,并将计算任务委托给一个Executor.

3、在构造函数中创建一个BlockingQueue,用它去保存完成的结果。计算完成时会调用FutureTask中done方法,当提交了一个任务后,首先把这个任务包装为一个QueueFuture,它是FutureTask的一个子类,然后覆写done方法,将结果置入BlockingQueue中.

4、

private class QueueingFuture<V>extends FutureTask<V>{

 QueueingFuture(Callable<V>c){super(c);}

  QueueingFuture(Runnable t, Vr){super(t,r);}

  protected void done(){

    completionQueue.add(this);

  }

}

5、新的网页渲染器

public class Renderer{

    privatefinal ExecutorService executor;

 

   Renderer(ExecutorService executor){this.executor=executor;}

    voidrenderPage(CharSequence source){

        final List<ImageInfo>info=scanForImageInfo(source);

         CompletionService<ImageData>completionService=

          newExecutorCompletionService<ImageData>(executor);

        for (final ImageInfo imageinfo:info)

           completionService.submit(newCallable<ImageData>(){

             public ImageData call(){

                    return imageinfo.downloadaImage();

             }

           });

   renderText(source);

    try{

       for(int t=0,n=info.size();t<n;t++){

            Future<ImageData>f=completionService.take();

           ImageData imageData=f.get();

            renderImage(imageData);

       }

    }

   catch(InterruptedException e){Thread.currentThread().interrupt();}

   catch(ExecutionException e) {throwlaunderThrowable(e.getCause());}

  }

}

 

 

}

 

你可能感兴趣的:(java,C++,c,C#,F#)