17-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建一个名为 Result
的类,用来存储本例中执行并发任务后的返回结果:
public class Result {
2.声明两个私有变量,一个名为 name
的 String
型变量和一个名为 value
的 int
型变量:
private String name;
private int value;
3.实现 get()
和 set()
方法,以设置和返回 name
和 value
的值:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
4.创建一个名为 Task
的类,并实现泛型为 Result
的 Callable
接口:
public class Task implements Callable<Result> {
5.声明一个名为 name
的私有 String
型变量:
private final String name;
6.实现该类的构造方法并初始化类中变量:
public Task(String name) {
this.name=name;
}
7.实现类中的 call()
方法。在本案例中,该方法会返回一个 Result
实例对象:
@Override
public Result call() throws Exception {
8.在控制台打印任务启动的相关信息:
System.out.printf("%s: Staring\n",this.name);
9.等待一段随机时间:
try {
long duration=(long)(Math.random()*10);
System.out.printf("%s: Waiting %d seconds for results.\n",
this.name,duration);
TimeUnit.SECONDS.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
10.计算5个随机数字之和,生成一个 int
型数值,并在 Result
实例对象中返回它:
int value=0;
for (int i=0; i<5; i++){
value+=(int)(Math.random()*100);
}
11.创建一个 Result
实例对象,并使用 Task
对象的名称和之前操作获取的结果来初始化对象中的变量:
Result result=new Result();
result.setName(this.name);
result.setValue(value);
12.在控制台打印任务结束的相关信息:
System.out.println(this.name+": Ends");
13.返回一个 Result
对象:
return result;
}
14.至此,开始实现应用程序的入口,创建包含 main()方
法的 Main
类:
public class Main {
public static void main(String[] args) {
15.用 Executors
类中的 newCachedThreadPool()
方法来创建一个 ThreadPool Executor
对象:
ExecutorService executor=(ExecutorService)Executors
.newCachedThreadPool();
16.创建一个 Task
对象列表,创建10个 Task
实例对象并加入列表中:
List<Task> taskList=new ArrayList<>();
for (int i=0; i<10; i++){
Task task=new Task("Task-"+i);
taskList.add(task);
}
17.创建一个 Future
对象列表。 Future
对象的泛型为 Result
类:
List<Future<Result>>resultList=null;
18.调用 ThreadPoolExecutor
类中的 invokeAll()
方法,返回结果会传给之前创建的 Future
对象列表:
try {
resultList=executor.invokeAll(taskList);
} catch (InterruptedException e) {
e.printStackTrace();
}
19.调用 shutdown()
方法来终止执行器:
executor.shutdown();
20.打印 Future
对象列表中存储的执行结果:
System.out.println("Main: Printing the results");
for (int i=0; i<resultList.size(); i++){
Future<Result> future=resultList.get(i);
try {
Result result=future.get();
System.out.println(result.getName()+": "+result.getValue());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}