java-使用CompletionService

本文介绍了一种使用ExecutorCompletionService优化网页渲染的过程。通过并行下载页面中的图片,减少了用户等待时间,提升了用户体验。该方案利用了Java并发工具,如ExecutorService、FutureTask和BlockingQueue,实现了高效的任务管理和结果获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());}

  }

}

 

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值