Java_并发线程_CompletionService
来源:互联网 发布:每年车祸数据统计 编辑:程序博客网 时间:2024/04/30 23:02
1.CompletionService源码分析
CompletionService内部实现还是维护了一个可阻塞的队列,通过代理设计模式,从而操作队列。/** * Creates an ExecutorCompletionService using the supplied * executor for base task execution and a * {@link LinkedBlockingQueue} as a completion queue. * * @param executor the executor to use * @throws NullPointerException if executor is {@code null} */ public ExecutorCompletionService(Executor executor) { if (executor == null) throw new NullPointerException(); this.executor = executor; this.aes = (executor instanceof AbstractExecutorService) ? (AbstractExecutorService) executor : null; this.completionQueue = new LinkedBlockingQueue<Future<V>>(); //新建一个完成队列 }//通过submit提交Callable任务对象 public Future<V> submit(Callable<V> task) { if (task == null) throw new NullPointerException(); RunnableFuture<V> f = newTaskFor(task); executor.execute(new QueueingFuture(f));//线程池执行task对象 return f; }/** * FutureTask extension to enqueue upon completion */ private class QueueingFuture extends FutureTask<Void> { QueueingFuture(RunnableFuture<V> task) { super(task, null); this.task = task; } protected void done() { completionQueue.add(task); //执行玩后将task返回对象放置于完成队列 } private final Future<V> task; }//通过take方法取得Future对象 public Future<V> take() throws InterruptedException { return completionQueue.take(); }
2.实例
public static void main(String[] args) {ExecutorService threadPool = Executors.newFixedThreadPool(3);CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool);//将任务添加至threadPool池中,但是只分配3个Thread对象for (int i = 1; i <= 10; i++) {final int seq = i;completionService.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {Thread.sleep(new Random().nextInt(5000));return seq;}});}for (int i = 0; i < 10; i++) {try {//completionService.take(), 至于call方法执行完成,take阻塞采用数据//future.get() 阻塞, 只有当call执行完成,System.out.println(completionService.take().get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}}
0 0
- Java_并发线程_CompletionService
- Java_并发线程_Condition
- Java_并发线程_Lock、ReadWriteLock
- Java_并发线程_Future、FutureTask、Callable
- Java_并发线程_Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- Java_并发线程_Future、FutureTask、Callable
- JAVA_并发
- 线程池基础类_CompletionService(JDK1.8)
- Java_线程
- JAVA_线程
- Java_线程
- java_线程整合
- Java_线程池ThreadPool
- Java_线程_ThreadLocal
- java_基础_线程
- Java_线程-Thread
- Java_多线程_线程状态
- 线程并发
- 软件行业做了3年,何去何从?究竟该搞哪个方面?迷茫+努力
- 求方程
- 敏捷相关Note
- java实现队列及队列的应用
- myeclipse10.7.1+maven3.23配置
- Java_并发线程_CompletionService
- web.py 0.3 新手指南
- 【博弈论+记忆化dp+visit数组+回溯】acm 2014 西安赛区 H problem make you happy
- RTS/CTS协议
- 第5条:避免创建不必要的对象
- [LeetCode] Two Sum
- mysqldump 备份导出数据排除某张表
- leetcode - Insert Interval
- 坐标下降法(Coordinate descent)