【Java】多线程学习——Callable和Future接口
Callable是一个接口。它是逻辑上的概念Task的一个具体存在(说成实现Implement可能会造成混淆,因为它是一个接口),它有一个带返回值的run()方法。
Future也是一个接口,它的作用是:
1、获取Callable中run方法的执行结果。
2、它能管理Callable的状态。
【示例】
package com.jvm; import java.util.concurrent.Callable; public class Calculator implements Callable<Integer> { private Integer number; public Calculator(Integer number) { if (number < 1) { throw new IllegalArgumentException("can not be negative !"); } this.number = number; } @Override public Integer call() throws Exception { if (number == 1) { return 1; } Integer result = 1; for (int i = 2; i < number; i++) { result *= i; } System.out.println("Result for number - " + number + " -> " + result); return result; } }
import com.jvm.Calculator; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); List<Future<Integer>> resultList = new ArrayList<>(); Random rand = new Random(); for (int i = 0; i < 10; i++) { Integer n = rand.nextInt(10) + 1; resultList.add(executor.submit(new Calculator(n))); } for (int i = 0; i < resultList.size(); i++) { Future<Integer> future = resultList.get(i); System.out.println( "[" + i + "]" + "Future result is -" + "- " + future.get() + "; And Task done is " + future.isDone()); } executor.shutdown(); } }
上面两个程序执行的结果如下:
Result for number - 9 -> 40320 Result for number - 10 -> 362880 Result for number - 4 -> 6 Result for number - 7 -> 720 Result for number - 8 -> 5040 [0]Future result is -- 40320; And Task done is true Result for number - 10 -> 362880 Result for number - 7 -> 720 Result for number - 6 -> 120 [1]Future result is -- 362880; And Task done is true Result for number - 8 -> 5040 Result for number - 5 -> 24 [2]Future result is -- 6; And Task done is true [3]Future result is -- 720; And Task done is true [4]Future result is -- 5040; And Task done is true [5]Future result is -- 720; And Task done is true [6]Future result is -- 362880; And Task done is true [7]Future result is -- 120; And Task done is true [8]Future result is -- 24; And Task done is true [9]Future result is -- 5040; And Task done is true