【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

  

猜你喜欢

转载自www.cnblogs.com/tigerhsu/p/10872507.html