`

ExecutorService invokeAll 实例

阅读更多

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

package cn.com.ld.study.thread;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class FutureTest {
	//缓存操作数据集
	private static final Map<Integer, List<Student>> sutdenMap = new HashMap<Integer, List<Student>>();
	//初始化操作数据
	static {
		List<Student> stuList = null;
		Student stu;
		for (int i = 0; i < 10; i++) {
			stuList = new ArrayList<Student>();
			for (int j = 0; j < 2; j++) {
				stu = new Student(j, "zld_" + i + "." + j, i);
				stuList.add(stu);
			}
			sutdenMap.put(i, stuList);
		}
	}

	public static class Student {
		private int id;
		private String name;
		private int classID;

		public Student(int id, String name, int classID) {
			this.id = id;
			this.name = name;
			this.classID = classID;
		}

		public String toString() {
			return Student.class.getName() + "(id:" + this.id + ",name:"
					+ this.name + ")";
		}

	}
    
	/**   
	 * @filename: SearchTask   
	 * @description: 查询任务  
	 * @author lida  
	 * @date 2013-4-1 下午3:02:29      
	 */
	public static class SearchTask implements Callable<List<Student>> {

		public final int classID;
		public long sleepTime;

		/**   
		 * <p>Title: </p>   
		 * <p>Description: </p>   
		 * @param classID  班级编号
		 * @param sleepTime  模拟操作所用的时间数(毫秒)
		 */
		SearchTask(int classID, long sleepTime) {
			this.classID = classID;
			this.sleepTime = sleepTime;
		}

		@Override
		public List<Student> call() throws Exception {
			//模拟操作所用的时间数(毫秒)
			Thread.sleep(sleepTime);
			List<Student> stuList = sutdenMap.get(classID);
			return stuList;
		}

	}

	public static void main(String[] args) {
		FutureTest ft = new FutureTest();
		ExecutorService exec = Executors.newCachedThreadPool();
		List<SearchTask> searchTasks = new ArrayList<SearchTask>();
		SearchTask st;
		for (int i = 0; i < 10; i++) {
			st = new SearchTask(i, 2001);//指定2001 毫米为最大执行时间
			searchTasks.add(st);
		}

		try {
			//要求认为在2000毫秒内返回结果,否则取消执行。
			List<Future<List<Student>>> futures = exec.invokeAll(searchTasks,
					2000, TimeUnit.MILLISECONDS);//invokeAll 第一个参数是任务列表;第二个参数是过期时间;第三个是过期时间单位
			for (Future<List<Student>> future : futures) {
				List<Student> students = future.get();
				for (Student student : students) {
					System.out.println(student.toString());
				}
			}
			exec.shutdown();
		} catch (InterruptedException e) {
			e.printStackTrace();
			Thread.interrupted();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
}


分享到:
评论

相关推荐

    java并发编程:Executor、Executors、ExecutorService.docx

    Executors是静态工厂类,用于创建不同类型的ExecutorService实例,如线程池。常见的线程池类型包括: - `newFixedThreadPool(int nThreads)`:创建一个固定大小的线程池,线程数量固定,超出的请求会被放入任务队列...

    Java多线程ForkJoinPool实例详解

    在compute()方法中,我们可以使用invokeAll()方法来执行子任务,使用get()方法来获取子任务的执行结果。 ForkJoinPool的优点是可以高效地执行任务,并且可以自动地管理线程池,避免了手动创建和管理线程的麻烦。...

    Executor框架使用详解

    `Future`常与`ExecutorService`的`submit()`方法一起使用,返回一个`Future`实例,可以通过该实例监控任务状态。 `CompletionService`接口扩展了`ExecutorService`,它提供了获取已完成任务的便捷方式,特别适用于...

    java使用任务架构执行任务调度示例

    `invokeAll()`用于批量执行任务,`shutdown()`和`shutdownNow()`用于关闭ExecutorService,`isTerminated()`和`isShutdown()`则用于检查ExecutorService的状态。 3. **ScheduledExecutorService接口**:...

    AbrastractExecutorService

    - **描述**:构造一个新的`AbstractExecutorService`实例。 #### 提交任务 - **submit(Callable&lt;T&gt; task)** - **描述**:提交一个返回值的任务用于执行,返回一个表示任务的未决结果的`Future`。 - **参数**:`...

    java中ThreadLocalRandom的使用详解

    executorService.invokeAll(callables); } } ``` 从上面的代码中可以看到,我们使用ThreadLocalRandom.current().nextInt()方法来生成随机数。这种方法可以避免多线程环境中的性能瓶颈。 ThreadLocalRandom类是...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...

    Java并发编程中使用Executors类创建和管理线程的用法

    除了上述方法,`Executors` 还提供了创建具有特定线程属性的线程池的能力,比如通过传入自定义的`ThreadFactory` 实例。`ThreadFactory` 是一个接口,用于创建新线程,可以用来定制线程的名称、优先级等属性。最简单...

    jdk1.7API文档(2)

    `java.util.concurrent`包中的`ExecutorService`接口新增了`invokeAll()`和`invokeAny()`方法,用于执行多个任务并等待任意一个或所有任务完成。 以上只是Java 1.7 API文档中的一部分重要更新。通过深入阅读和理解...

    Java通过Fork/Join优化并行计算

    `ForkJoinPool`是Fork/Join框架的执行引擎,它类似于`ExecutorService`,但设计用于高效地处理`ForkJoinTask`。在这个例子中,创建了一个`ForkJoinPool`实例,然后调用其`invoke`方法启动任务。 2. **...

    Java并发程序设计教程

    - `invokeAll(Collection&lt;Callable&lt;T&gt;&gt; tasks)`:执行一组可返回结果的任务。 - `invokeAny(Collection&lt;Callable&lt;T&gt;&gt; tasks)`:执行一组可返回结果的任务,并返回最先完成的那个任务的结果。 - `shutdown()`:...

    Java多线程的4种实现方式(源代码)

    - **实现原理**:实现`Runnable`接口,并将该接口的实例传递给`Thread`类的构造方法。 - **示例代码**: ```java public class MyRunnable implements Runnable { private String threadName; public ...

Global site tag (gtag.js) - Google Analytics