Java并发编程:Callable、Future、FutureTask的使用

继承关系:

1、接口Callable与Runnable

1.1、Runnable接口中只有一个void run()方法,其返回值是void,执行完任务后,无法返回任何结果(只能通过操作共享变量);

1.2、Callable接口位于java.util.concurrent包下,只有一个V call() throws Exception方法,返回一个输入类型V;

Callable需要配合ExecutorService来使用,其中声明了若干个submit方法,以下两种最常用:

Future submit(Callabletask);

Future> submit(Runnable task);

2、接口Future:

表示具体的Runnable或者Callable任务的具体的执行结果,

通过以下五种方法,实现任务的中断、是否完成、获取结果。

boolean cancel(booleanmayInterruptIfRunning):试图取消对此任务的 执行:参数为true表示可以打断正在执行的任务。

返回false:任务已经完成;任务未完成参数为true;

返回true:任务未开始;任务未完成参数为false;

isCancelled():如果在任务正常完成前将其取消,则返回true。。

isDone():方法表示任务是否已经完成,若任务完成,则返回true

get():等待计算完成返回V;

get(long timeout, TimeUnit unit):最多等待timeout时间,若结果可用返回。

3、类FutureTask:

FutureTask实现了Future和Runnable接口,有两种构造器:

public FutureTask(Callablecallable) { }public FutureTask(Runnable runnable, V result) { }

实例代码:

1、使用Callable和Future获取结果:

//使用Callable和Future获取执行结果;

public classTest {public static voidmain (String[] args){

ExecutorService executor=Executors.newCachedThreadPool();

Task task= newTask();

Future result =executor.submit(task);

executor.shutdown();try{

Thread.sleep(1000);

}catch(InterruptedException e1) {

e1.printStackTrace();

}

System.out.println("主线程在执行任务");try{

System.out.println("task运行结果"+result.get());

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

System.out.println("所有任务执行完毕");

}

}class Task implements Callable{

@Overridepublic Integer call() throwsException {

System.out.println("子线程在进行计算");

Thread.sleep(3000);int sum = 0;for(int i=0;i<100;i++)

sum+=i;returnsum;

}

}

View Code

子线程在进行计算

主线程在执行任务

task运行结果4950

所有任务执行完毕

result

2、使用Callable+FutureTask获取执行结果:

public classTest {public static voidmain(String[] args) {//第一种方式

ExecutorService executor =Executors.newCachedThreadPool();

Task task= newTask();

FutureTask futureTask = new FutureTask(task);

executor.submit(futureTask);

executor.shutdown();//第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread

/*Task task = new Task();

FutureTask futureTask = new FutureTask(task);

Thread thread = new Thread(futureTask);

thread.start();*/

try{

Thread.sleep(1000);

}catch(InterruptedException e1) {

e1.printStackTrace();

}

System.out.println("主线程在执行任务");try{

System.out.println("task运行结果"+futureTask.get());

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

System.out.println("所有任务执行完毕");

}

}class Task implements Callable{

@Overridepublic Integer call() throwsException {

System.out.println("子线程在进行计算");

Thread.sleep(3000);int sum = 0;for(int i=0;i<100;i++)

sum+=i;returnsum;

}

}

View Code

子线程在进行计算

主线程在执行任务

task运行结果4950

所有任务执行完毕

result

futuretask java 并发请求_Java并发机制(9)--Callable、Future、FutureTask的使用相关推荐

  1. futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...

  2. futuretask java 并发请求_Java并发案例04---Future和 FutureTask

    4.Future和 FutureTask 4.1 Future是Callable的返回结果. 它有三个功能 1.判断任务是否完成 2.能够中断任务 3.能够获取任务返回结果 4.2 FutureTas ...

  3. futuretask java 并发请求_Java面试题整理一(侧重多线程并发)

    1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...

  4. java executor 异步_Java并发编程11-异步执行框架Executor

    1 Executor框架的简介 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时 ...

  5. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

  6. java 并发锁_Java并发教程–锁定:内在锁

    java 并发锁 在之前的文章中,我们回顾了在不同线程之间共享数据的一些主要风险(例如原子性和可见性 )以及如何设计类以安全地共享( 线程安全的设计 ). 但是,在许多情况下,我们将需要共享可变数据, ...

  7. java 并发执行_Java并发执行器的懒惰开发人员简介

    java 并发执行 如果我告诉您util.concurrent API自2004年起提供此类服务,我就会自欺欺人.但是,我想回顾一下一些很酷的功能. 并发专家,现在是时候关闭该窗口了. 所有其他人,请 ...

  8. java并发常量_Java并发编程-常量对象(七)

    在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...

  9. Vue3(撩课学院)笔记09-axios简介,发起get请求的两种方式,发起带参的get及post请求,发起并发请求,并发请求结果将数组展开,axios全局配置,axios配置及封装,请求和响应拦截

    1.axios简介 axios是基于promise可以用于浏览器和node.js的网络请求库,在服务器端使用原生node.js,在浏览气短使用ajax(即XMLHttpRequests) 2.axio ...

最新文章

  1. 安装 Docker 一
  2. linux发送http请求xml报文,使用curl命令行发送/发布xml文件
  3. PHP安装之configure的配置参数
  4. intellij 快捷键_IntelliJ中的键盘快捷键
  5. 传输设备,光端机的应用及故障分析
  6. linux上mysql卸数_Linux下MySQL卸载和安装图文教程
  7. Effective C# 原则42:使用特性进行简单的反射(译)
  8. WPF 获取程序路径的一些方法,根据程序路径获取程序集信息
  9. 面试题-为什么索引使用B+树、而不是B树?或者其他红黑树,二叉树
  10. 玩转基金(3)买卖基金
  11. VMware Workstation for Windows 历史版本
  12. WEEK5 周记 作业——差分数组_TT的魔法猫
  13. 社区动态——恭喜海豚调度中国区用户组新晋 9 枚“社群管理员”
  14. CPSR 和 SPSR
  15. 动态规划java实现数塔问题_动态规划入门_数塔问题
  16. elasticsearch入门笔记
  17. 软件型企业认定资质的好处
  18. 计算机的英文怎么说不是computer,【英语写作】“开电脑”可不是“open the computer”,说错了很尴尬!...
  19. win10.java默认程序_Win10把IE修改为默认浏览器的两种方法
  20. git删除未监视的文件(untracked files)命令用法

热门文章

  1. Android学习总结(1)——好的 Android 开发习惯
  2. su自带模型库怎么打开_SU超强外挂!建筑模型一键生成,还能任意编辑
  3. 26_多线程_第26天(Thread、线程创建、线程池)
  4. 第四章 自上而下分析
  5. SpringMVC 中整合JSON、XML视图二
  6. NetBeans第一部分代码提交Apache
  7. 物联网技术或颠覆传统高等教育
  8. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
  9. 博文目录(最新更新:2018.6.6)
  10. winform 开发涉及到的问题