六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

(android实战)线程池实现,并通过CompletionService,来实现反馈处理(转载)

[复制链接]

升级  18.4%

192

主题

192

主题

192

主题

进士

Rank: 4

积分
592
 楼主| 发表于 2012-12-19 23:16:50 | 显示全部楼层 |阅读模式
(android实战)线程池实现,并通过CompletionService,来实现反馈处理(转载)

<div id="cnblogs_post_body">import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestCompletionService {
public static void main(String[] args) throws InterruptedException,
ExecutionException {
ExecutorService exec = Executors.newFixedThreadPool(10);
CompletionService serv = new ExecutorCompletionService(exec);
for (int index = 0; index < 5; index++) {
  final int NO = index;
  Callable downImg = new Callable() {
      public String call() throws Exception {
         Thread.sleep((long) (Math.random() * 10000));
         return "Downloaded Image " + NO;
      }
  };
serv.submit(downImg);
}
Thread.sleep(1000 * 2);
System.out.println("Show web content");
for (int index = 0; index < 5; index++) {
   Future task = serv.take();
   String img = (String)task.get();
   System.out.println(img);
}
System.out.println("End");
// 关闭线程池
exec.shutdown();
}
}
考虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示。

Java的并发库的CompletionService可以满足这种场景要求。该接口有两个重要方法:submit()和take()。submit用于提交一个runnable或者callable,一般会提交给一个线程池处理;而take就是取出已经执行完毕runnable或者callable实例的Future对象,如果没有满足要求的,就等待了。 CompletionService还有一个对应的方法poll,该方法与take类似,只是不会等待,如果没有满足要求,就返回null对象。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表