ExecutorService invokeAll 实例(转)

 10个班级,每个班级20名学生,在指定的时间内查询每个班级学生的集合。 

Java代码  

    1. package cn.com.ld.study.thread;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.Collection;  
    5. import java.util.HashMap;  
    6. import java.util.List;  
    7. import java.util.Map;  
    8. import java.util.concurrent.Callable;  
    9. import java.util.concurrent.ExecutionException;  
    10. import java.util.concurrent.ExecutorService;  
    11. import java.util.concurrent.Executors;  
    12. import java.util.concurrent.Future;  
    13. import java.util.concurrent.TimeUnit;  
    14.   
    15. public class FutureTest {  
    16.     //缓存操作数据集  
    17.     private static final Map<Integer, List<Student>> sutdenMap = new HashMap<Integer, List<Student>>();  
    18.     //初始化操作数据  
    19.     static {  
    20.         List<Student> stuList = null;  
    21.         Student stu;  
    22.         for (int i = 0; i < 10; i++) {  
    23.             stuList = new ArrayList<Student>();  
    24.             for (int j = 0; j < 2; j++) {  
    25.                 stu = new Student(j, "zld_" + i + "." + j, i);  
    26.                 stuList.add(stu);  
    27.             }  
    28.             sutdenMap.put(i, stuList);  
    29.         }  
    30.     }  
    31.   
    32.     public static class Student {  
    33.         private int id;  
    34.         private String name;  
    35.         private int classID;  
    36.   
    37.         public Student(int id, String name, int classID) {  
    38.             this.id = id;  
    39.             this.name = name;  
    40.             this.classID = classID;  
    41.         }  
    42.   
    43.         public String toString() {  
    44.             return Student.class.getName() + "(id:" + this.id + ",name:"  
    45.                     + this.name + ")";  
    46.         }  
    47.   
    48.     }  
    49.       
    50.     /**    
    51.      * @filename: SearchTask    
    52.      * @description: 查询任务   
    53.      * @author lida   
    54.      * @date 2013-4-1 下午3:02:29       
    55.      */  
    56.     public static class SearchTask implements Callable<List<Student>> {  
    57.   
    58.         public final int classID;  
    59.         public long sleepTime;  
    60.   
    61.         /**    
    62.          * <p>Title: </p>    
    63.          * <p>Description: </p>    
    64.          * @param classID  班级编号 
    65.          * @param sleepTime  模拟操作所用的时间数(毫秒) 
    66.          */  
    67.         SearchTask(int classID, long sleepTime) {  
    68.             this.classID = classID;  
    69.             this.sleepTime = sleepTime;  
    70.         }  
    71.   
    72.         @Override  
    73.         public List<Student> call() throws Exception {  
    74.             //模拟操作所用的时间数(毫秒)  
    75.             Thread.sleep(sleepTime);  
    76.             List<Student> stuList = sutdenMap.get(classID);  
    77.             return stuList;  
    78.         }  
    79.   
    80.     }  
    81.   
    82.     public static void main(String[] args) {  
    83.         FutureTest ft = new FutureTest();  
    84.         ExecutorService exec = Executors.newCachedThreadPool();  
    85.         List<SearchTask> searchTasks = new ArrayList<SearchTask>();  
    86.         SearchTask st;  
    87.         for (int i = 0; i < 10; i++) {  
    88.             st = new SearchTask(i, 2001);//指定2001 毫米为最大执行时间  
    89.             searchTasks.add(st);  
    90.         }  
    91.   
    92.         try {  
    93.             //要求认为在2000毫秒内返回结果,否则取消执行。  
    94.             List<Future<List<Student>>> futures = exec.invokeAll(searchTasks,  
    95.                     2000, TimeUnit.MILLISECONDS);//invokeAll 第一个参数是任务列表;第二个参数是过期时间;第三个是过期时间单位  
    96.             for (Future<List<Student>> future : futures) {  
    97.                 List<Student> students = future.get();  
    98.                 for (Student student : students) {  
    99.                     System.out.println(student.toString());  
    100.                 }  
    101.             }  
    102.             exec.shutdown();  
    103.         } catch (InterruptedException e) {  
    104.             e.printStackTrace();  
    105.             Thread.interrupted();  
    106.         } catch (ExecutionException e) {  
    107.             e.printStackTrace();  
    108.         }  
    109.     }  
    110. }  
    111. http://zld406504302.iteye.com/blog/1840091
时间: 2024-10-01 05:10:23

ExecutorService invokeAll 实例(转)的相关文章

Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll(转)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下,我们使用Runnable作为基本的任务表示形式,但是Runnable是一种有很大局限的抽象,run方法中只能记录日志,打印,或者把数据汇总入某个容器(一方面内存消耗大,另一方面需要控制同步,效率很大的限制),总之不能返回执行的结果:比如同时1000个任务去网络上抓取数据,然后将抓取到的数据进行处理(处理方式不定),我觉得最好的方式就是提供回调接口,把处

Java线程池 ExecutorService

本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类(详细了解这两个实现类,点击这里):

Fork and Join: Java也可以轻松地编写并发程序

原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) 如今,多核处理器在服务器,台式机及笔记本电脑上已经很普遍了,同时也被应用在更小的设备上,比如智能手机和平板电脑.这就开启了并发编程新的潜力,因为多个线程可以在多个内核上并发执行.在应用中要实现最大性能的一个重要技术手段是将密集的任务分隔成多个可以并行执行的块,以便可以最大化利用计算能力. 处理并发(并行)程序,一向都是比较困难的,因为你必须处理线程同步和共享数据

Android自定义线程池的编程实战

1.Executor 简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭,可以简化并发编程的操作.因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题--如果我们在构造器中启动

Java 并发工具包 java.util.concurrent 用户指南

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html. 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载. 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平

【JAVA秒会技术之多线程】Java 并发工具包 java.util.concurrent 用户指南

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类.在这个包被添加以前,你需要自己去动手实现自己的相关工具类.本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们.本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异.

Android 自定义线程池的实战

前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 Android AsyncTask 深度理解.简单封装.任务队列分析.自定义线程池    ------------------------------------------------------------------------------------------------------- 1.E

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池.下面我们分别介绍一下这三个类. Java线程池ExecutorService继承树: 一.ThreadPoolExecutor ThreadPoolExecutor是Exe

JAVA进阶----主线程等待子线程各种方案比较(转)

创建线程以及管理线程池基本理解 参考原文链接:http://www.oschina.net/question/12_11255?sort=time  一.创建一个简单的java线程 在 Java 语言中,一个最简单的线程如下代码所示:  Java代码   Runnable runnable = new Runnable(){      public void run(){         System.out.println("Run");      }   }   可通过下面一行代码