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();
}
}
}
分享到:
相关推荐
Executors是静态工厂类,用于创建不同类型的ExecutorService实例,如线程池。常见的线程池类型包括: - `newFixedThreadPool(int nThreads)`:创建一个固定大小的线程池,线程数量固定,超出的请求会被放入任务队列...
在compute()方法中,我们可以使用invokeAll()方法来执行子任务,使用get()方法来获取子任务的执行结果。 ForkJoinPool的优点是可以高效地执行任务,并且可以自动地管理线程池,避免了手动创建和管理线程的麻烦。...
`Future`常与`ExecutorService`的`submit()`方法一起使用,返回一个`Future`实例,可以通过该实例监控任务状态。 `CompletionService`接口扩展了`ExecutorService`,它提供了获取已完成任务的便捷方式,特别适用于...
`invokeAll()`用于批量执行任务,`shutdown()`和`shutdownNow()`用于关闭ExecutorService,`isTerminated()`和`isShutdown()`则用于检查ExecutorService的状态。 3. **ScheduledExecutorService接口**:...
- **描述**:构造一个新的`AbstractExecutorService`实例。 #### 提交任务 - **submit(Callable<T> task)** - **描述**:提交一个返回值的任务用于执行,返回一个表示任务的未决结果的`Future`。 - **参数**:`...
executorService.invokeAll(callables); } } ``` 从上面的代码中可以看到,我们使用ThreadLocalRandom.current().nextInt()方法来生成随机数。这种方法可以避免多线程环境中的性能瓶颈。 ThreadLocalRandom类是...
本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...
除了上述方法,`Executors` 还提供了创建具有特定线程属性的线程池的能力,比如通过传入自定义的`ThreadFactory` 实例。`ThreadFactory` 是一个接口,用于创建新线程,可以用来定制线程的名称、优先级等属性。最简单...
`java.util.concurrent`包中的`ExecutorService`接口新增了`invokeAll()`和`invokeAny()`方法,用于执行多个任务并等待任意一个或所有任务完成。 以上只是Java 1.7 API文档中的一部分重要更新。通过深入阅读和理解...
`ForkJoinPool`是Fork/Join框架的执行引擎,它类似于`ExecutorService`,但设计用于高效地处理`ForkJoinTask`。在这个例子中,创建了一个`ForkJoinPool`实例,然后调用其`invoke`方法启动任务。 2. **...
- `invokeAll(Collection<Callable<T>> tasks)`:执行一组可返回结果的任务。 - `invokeAny(Collection<Callable<T>> tasks)`:执行一组可返回结果的任务,并返回最先完成的那个任务的结果。 - `shutdown()`:...
- **实现原理**:实现`Runnable`接口,并将该接口的实例传递给`Thread`类的构造方法。 - **示例代码**: ```java public class MyRunnable implements Runnable { private String threadName; public ...