Java多线程的Callable, Future, FutureCallback
Callable可以看成是一个增强版的Runnable, 带返回结果, 需要通过Future或者FutureTask来提交任务或运行线程, 然后通过Future/FutureTask的get方法得到返回结果.
Callable在子线程中运行, 在主线程中异步得到执行结果(get()方法是阻塞的), 或者检查是否已取消, 是否已完成(检查取消和完成的方法是非阻塞的)
通过Thread子线程启动
这种方式, 需要创建一个FutureTask对象, 再用这个FutureTask对象创建一个Thread来运行. 后续操作都通过FutureTask进行.
public class DemoCallableFuture {
public static void main(String[] args) {
FutureTask<String> task = new FutureTask<>(()->{
System.out.println("task start");
Thread.sleep(1000);
System.out.println("task done");
return "task get";
}); new Thread(task).start(); FutureTask<String> task2 = new FutureTask<>(()->{
System.out.println("task2 start");
Thread.sleep(1000);
System.out.println("task2 done");
return "task2 get";
}); new Thread(task2).start(); if (task.isCancelled()) {
System.out.println("task cancelled yes");
} else {
System.out.println("task cancelled no");
}
if (task.isDone()) {
System.out.println("task done yes");
} else {
System.out.println("task done no");
} try {
System.out.println(task.get());
} catch (InterruptedException|ExecutionException e) {
e.printStackTrace();
} if (task2.isCancelled()) {
System.out.println("task2 cancelled yes");
} else {
System.out.println("task2 cancelled no");
}
if (task2.isDone()) {
System.out.println("task2 done yes");
} else {
System.out.println("task2 done no");
}
try {
System.out.println(task2.get());
} catch (InterruptedException|ExecutionException e) {
e.printStackTrace();
}
}
}
运行结果
task start
task cancelled no
task done no
task2 start
task2 done
task done
task get
task2 cancelled no
task2 done yes
task2 get
通过ExecutorService线程池启动
这种方式, 通过线程池submit一个Callable对象, 就会得到一个Future对象, 根据这个Future对象做后续操作
public class DemoCallableFuture2 {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(4);
Future<String> future = service.submit(()->{
System.out.println("task start");
Thread.sleep(1000);
System.out.println("task done");
return "task get";
}); if (future.isCancelled()) {
System.out.println("task cancelled yes");
} else {
System.out.println("task cancelled no");
}
if (future.isDone()) {
System.out.println("task done yes");
} else {
System.out.println("task done no");
} try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} if (future.isCancelled()) {
System.out.println("task cancelled yes");
} else {
System.out.println("task cancelled no");
}
if (future.isDone()) {
System.out.println("task done yes");
} else {
System.out.println("task done no");
} try {
System.out.println(future.get());
} catch (InterruptedException|ExecutionException e) {
e.printStackTrace();
}
}
}
运行结果
task cancelled no
task done no
task start
task cancelled no
task done no
task done
task get
.
FutureCallback
FutureCallback是Google Guava中的一个类, 解决的是Future中get阻塞的问题, 让全过程异步. 需要使用ListeningExecutorService的线程池提交.
代码例子
public class DemoFutureCallback {
public static void main(String[] args) {
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); for (int i = 0; i < 5; i++) {
int j = i;
ListenableFuture<String> future = service.submit(()->{
System.out.println("task start");
Thread.sleep(1000);
System.out.println("task done");
return "task return " + j;
}); Futures.addCallback(future, new FutureCallback<String>() {
@Override
public void onSuccess(String s) {
System.out.println("callback success: " + s);
} @Override
public void onFailure(Throwable throwable) {
throwable.printStackTrace();
}
});
}
System.out.println("thread ongoing");
service.shutdown();
}
}
运行结果
task start
task start
task start
thread ongoing
task start
task start
task done
callback success: task return 0
task done
callback success: task return 1
task done
callback success: task return 3
task done
callback success: task return 4
task done
callback success: task return 2 Process finished with exit code 0
Java多线程的Callable, Future, FutureCallback的更多相关文章
- Java多线程:Callable,Future,FutureTask
一.Future Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果. 1.Callable接口类似于Runnable,只是Runnable ...
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- java 并发runable,callable,future,futureTask
转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...
- java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】
Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...
- Java多线程知识-Callable和Future
Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需 ...
- java.util.concuttent Callable Future详解
在传统的多线程实现方式中(继承Thread和实现Runnable)无法直接获取线程执行的返回结果,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 从 ...
- Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)
java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)java多线程同步以及线程间通信详解&消费者生产者模式&死锁& ...
随机推荐
- E2E测试工具之--01 Cypress 上手使用
The web has evolved. Finally, testing has too. 1. 简介 cypress 最近很火的e2e(即end to end(端到端))测试框架,它基于node ...
- Centos7.3安装nexus-3.14.0-04
nexus-3.14.0-04的安装 nexus-3.14.0-04-unix.tar.gz 1.下载nexus 2.上传到服务器/root ...
- PostgreSQL分区表实现——pg_pathman安装、配置
近日由于系统运行时间太长,数据库库表中的数据也是越来越多,为了缩短库表的操作时间,所以对数据库中的部分库表进行分区的操作. 通过研究,决定采用pg_pathman插件对库表进行分区操作.pg_path ...
- 产生大于N的Smith数
实验三 求Smith数 实验目的: 通过本次实验,掌握穷举算法的基本思想. 实验环境: 硬件:PC机 软件:windows操作系统,C语言 实验内容: 若一个合数的质因数分解式逐位相加之和等于其本身 ...
- Unity进阶之:MVC编程思想
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- kali 攻击wordpress + trunkey linux wordpress 安装方法
Kali-linux攻击WordPress和其他应用程序 今天越来越多的企业利用SAAS(Software as a Service)工具应用在他们的业务中.例如,他们经常使用WordPress作 ...
- danci4
advantage 英 [əd'vɑːntɪdʒ] 美 [əd'væntɪdʒ] n. 优势:利益:有利条件 vi. 获利 vt. 有利于:使处于优势 lack 英 [læk] 美 [læk] vt. ...
- CSE301 – Bio-Computation
CSE301 – Bio-Computation Assessment 3Contribution to overall module assessment 10%Submission deadlin ...
- windows 10 下使用Navicat for oracle 数据库还原
一.前期准备 1.安装windows 10系统 2.安装oracle 11g 数据库 3.安装PLsql(也不需要) 4.安装sqlplus(这个必须有) 5.使用下面这个东西新建数据库(不懂创建的话 ...
- nginx和ftp搭建图片服务器
一.需要的组件 图片服务器两个服务: Nginx(图片访问): 1.http服务:可以使用nginx做静态资源服务器.也可以使用apache.推荐使用nginx,效率更高. 2.反向代理 实现 负载均 ...