当前位置: 首页 > news >正文

Callable和Future用法示例

Callable和Future用法示例:

1.Callable 和 Future接口

  Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

Callable和Runnable有几点不同:

(1)Callable规定的方法是call(),而Runnable规定的方法是run().

(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

(3)call()方法可抛出异常,而run()方法是不能抛出异常的。

(4)运行Callable任务可拿到一个Future对象, Future表示异步计算的结果。

  • 它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
  • 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

2.注意事项如下:

 Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。

Callable要采用ExecutorSevice的submit方法提交,返回的future对象可以取消任务。

CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。

3.Java示例代码:

3.1 Callable接口的使用:

package com.chang;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class CallableAndFuture {

 public static void main(String[] args) throws Exception {

    //创建一个固定大小的线程池
    ExecutorService pool = Executors.newFixedThreadPool(1);
    // 向线程池提交一个线程任务,这个线程任务返回一句话

    Future<String> future = pool.submit(new Callable<String>() {

        @Override
        public String call() throws Exception {

            return "科大讯飞是中国最大的语音提供商";
        }

    });
    //获取线程执行的结果
    System.out.println(future.get());;

    MyTask task = new MyTask();
    Future<String> futrue2 = pool.submit(task);

    //取消线程任务
    futrue2.cancel(true);
    System.out.println("任务已经取消:"+futrue2.isCancelled());
    System.out.println("返回结果======"+futrue2.get());
    System.out.println(future.get(1, TimeUnit.SECONDS));
}

public static class MyTask implements Callable<String>{
    @Override
    public String call() throws Exception {

        return "科大讯飞是中国最大的语音提供商";
    }

} 

}

3.2. 提交一组任务,返回一组任务的结果;

package com.chang;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAdnFuture2 {

public static void main(String[] args) throws Exception {
    ExecutorService pool = Executors.newFixedThreadPool(10);
    CompletionService<Integer>   service = new ExecutorCompletionService<Integer>(pool);

    for(int i=0;i<10;i++) {
        final int num = i;
         service.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return num;
            }
        });
    }
    for(int i=0;i<9;i++) {
        Future<Integer>  result = service.take();
        System.out.println(result.get());
    }
}

}

转载于:https://blog.51cto.com/13298029/2115688

相关文章:

  • 谁说我们IT不重要???
  • linux-NAT连接外网
  • DataWorks支持PyODPS类型任务
  • JS 时间函数 / 格式化时间戳
  • THML DOM / Element 对象操作
  • [Excel VBA]单元格区域引用方式的小结
  • 量子计算机还没完全实现,硅谷已流行开量子计算聚会
  • 1.安装zabbix
  • K最近邻算法(KNN)
  • ssh scp远程免密
  • 量子力学科普
  • Openssh远程访问及控制
  • Cocos Creator Slider(进度条)的三种实现
  • 第2节、好朋友手牵手——冒泡排序
  • vscode下调试运行c++
  • Docker: 容器互访的三种方式
  • dva中组件的懒加载
  • ES10 特性的完整指南
  • HTTP请求重发
  • iOS 颜色设置看我就够了
  • iOS编译提示和导航提示
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • magento 货币换算
  • 京东美团研发面经
  • 排序(1):冒泡排序
  • 入门到放弃node系列之Hello Word篇
  • 首页查询功能的一次实现过程
  • 温故知新之javascript面向对象
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​业务双活的数据切换思路设计(下)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (搬运以学习)flask 上下文的实现
  • (力扣题库)跳跃游戏II(c++)
  • (转)详解PHP处理密码的几种方式
  • .net的socket示例
  • .Net各种迷惑命名解释
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ IO.File ] FileSystemWatcher
  • [ solr入门 ] - 利用solrJ进行检索
  • [1181]linux两台服务器之间传输文件和文件夹
  • [bzoj2957]楼房重建
  • [codevs] 1029 遍历问题
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [CSS]文字旁边的竖线以及布局知识
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [HCIE] IPSec-VPN (手工模式)
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [Leetcode] Permutations II
  • [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
  • [MTK]安卓8 ADB执行ota升级