Java多线程-Executor框架:CompletionService

来源:互联网 发布:淘宝模特怎么入行 编辑:程序博客网 时间:2024/05/19 14:37

前言:
  ExecutorService并不是按照submit(Callable/Runnable)的顺序来完成任务的(ExecutorService内部有一个List来维护任务队列),每submit一次返回的Future对象所对应的任务不一定是完成的。所以,当你按照顺序submit任务并按照顺序将返回的Future加入到一个List中,并遍历这个List去调用每个Future的get()方法时会被阻塞。CompletionService很好的解决了这个问题。
  


原理:
  CompletionService会将Executor执行任务的返回结果Future加入到BlockingQueue,它的take()会不断地从BlockingQueue中取Future,如果该队列为空,take()方法会发生阻塞。CompletionService很好地将完成任务并返回Future结果和对结果的处理进行了分离。
注:类似于生产者和消费者的关系。


构造方法:

  • ExecutorCompletionService(Executor )
  • ExecutorCompletionService(Executor ,BlockingQueue )

常用方法:

  • umbit():提交任务,Executor去执行该任务
  • take():从阻塞队列中取执行结果即Future对象
  • poll():该方法与take类似,只是不会等待,如果没有满足要求,就返回null
  • poll(long , TimeUnit ):设置等待时间

ExecutorService executor = Executors.newCachedThreadPool();CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(executor);// 10个生产者for(int i=0;i<10;i++){    completionService.submit(new Callable());}   // 一个消费者for(int i=0;i<10;i++){    try {        int result = completionService.take().get();    } catch (InterruptedException e) {        e.printStackTrace();    } catch (ExecutionException e) {        e.printStackTrace();    }}       executor.shutdown();
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联想天逸310卡怎么办 新买的鼠标没反应怎么办 联想笔记本触屏鼠标失灵怎么办 无线鼠标接收器丢了怎么办 联想笔记本系统重装失败怎么办 联想笔记本屏幕闪屏怎么办 种植牙螺钉掉了怎么办 水管牙断里面了怎么办 水龙头起泡器不起泡怎么办 14mm乘8mm残留怎么办 宝宝吃了螺丝冒怎么办 收割机滚筒皮带轮键槽滚了怎么办 微信界面变小了怎么办 拉杆箱螺丝掉了怎么办 洗衣机应急门锁没有拉绳怎么办? 奔驰glc发动机声音大怎么办 淋膜机模具螺丝拧不动怎么办 一字螺丝滑丝了怎么办 螺丝拧歪卡住了怎么办 车牌螺丝拧歪了怎么办 空心墙打膨胀螺丝打不上怎么办 沉孔内六角螺丝滑丝怎么办 内六角螺丝滑了怎么办? 三色灯不变光了怎么办 卧室灯不变色了怎么办 圆柱齿轮减速机噪音大怎么办 轴与套间隙生锈怎么办 汽车停小区被刮怎么办 下楼梯摔跤了 屁股疼 怎么办 剧烈咳嗽震的肚子疼怎么办 饺子粘在盘子上怎么办 生饺子粘在盘子怎么办 饺子粘在案板上怎么办 饺子冷冻粘起了怎么办 冰箱饺子冻住了怎么办 水饺都冻一块了怎么办 wps卸载了后文件打不开怎么办 六角螺母拧滑了怎么办 梅花内六角螺丝扭滑丝了怎么办 眼镜螺丝滑丝了怎么办 大螺丝拆不下来怎么办