zoukankan      html  css  js  c++  java
  • 【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
    

      

  • 相关阅读:
    BZOJ 1562 [NOI2009] 变换序列
    BZOJ 2535:NOI 2010 航空管制
    C++ 莫队算法(转)
    SDOI2013直径(树的直径)
    c++分块算法(暴力数据结构)
    洛谷题解 P2865 【[USACO06NOV]路障Roadblocks】
    c++最短路经典问题
    LOJ#10065. 「一本通 3.1 例 2」北极通讯网络
    最小生成树(kruscal算法)
    飞屋环游记
  • 原文地址:https://www.cnblogs.com/tigerhsu/p/10872507.html
Copyright © 2011-2022 走看看