zoukankan      html  css  js  c++  java
  • (转载)Java多线程返回值处理

     

    一、概述

      到目前为止,我们已经能够声明并使一个线程任务运行起来了。但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时该怎么办呢?

      答案是使用Callable。之前定义的任务都直接实现了Runnable,该接口的run方法并无返回值。而Callable的call方法可以根据你传入的泛型参数返回对应类型的数据。

    二、实现

      1.实现Callable接口,定义可返回结果的线程任务

    复制代码
    public class TaskCallable implements Callable<String>{
        private int id;
        public TaskCallable(int id){
            this.id = id;
        }
        @Override
        public String call() throws Exception {
            
            return "result of taskWithResult "+id;
        }
    }
    复制代码

      注意,泛型参数String表示的是该任务执行之后返回结果的类型。

      2.将该任务交给线程执行者executor,让他来代理执行这些线程

    复制代码
    ExecutorService exec = Executors.newCachedThreadPool();//工头
    ArrayList<Future<String>> results = new ArrayList<Future<String>>();//
    for(int i = 0 ; i < 10 ;i++){
        results.add(exec.submit(new TaskCallable(i)));//submit返回一个Future,代表了即将要返回的结果
    }
    复制代码

      注意,此时需要使用executor的submit方法来调用Callable的call。

      该方法将返回一个Future接口的对象,它的泛型参数代表了call方法要返回的参数类型。

      3.Future类型

      简单的了解了下Future类型:按照名字判断该类型对象代表了线程执行完成后的结果,所以叫Future。那么在获取该类型存放的线程运行结果时,可能该线程并未运行完毕,所以称其为“将来的结果”。

    •   首先,可以用isDone()方法来查询Future是否已经完成,任务完成后,可以调用get()方法来获取结果
    •     如果不加判断直接调用get方法,此时如果线程未完成,get将阻塞,直至结果准备就绪
  • 相关阅读:
    CDH Mysql元数据库升级
    greenplum gpcheckperf 命令(GP集群压力测试)
    centos7 升级openssh到openssh-8.0p1版本(转)
    正则表达式中的 1
    Docker系列03—Docker 基础入门
    Docker系列01—容器的发展历程
    二进制安装部署 4 kubernetes集群---超详细教程
    kubernetes系列11—PV和PVC详解
    kubernetes系列10—存储卷详解
    kubernetes系列09—Ingress控制器详解
  • 原文地址:https://www.cnblogs.com/gaoxufei/p/6912424.html
Copyright © 2011-2022 走看看