Callable、Future、FutureTask浅析
1、Callable<V>接口
Runnable接口
public interface Runnable { public abstract void run(); }
Callable
public interface Callable<V> { V call() throws Exception; }
runnable接口 Callable接口 都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行,两者实现了ExcutorService接口
ExecutorService接口
<T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task);
2、Future<V>
获得异步计算结果,说白了就是对具体的Runnable或者Callable对象任务执行的结果进行获取(get()),取消(cancel()),判断是否完成等操作。
public interface Future<V> { //如果任务没开始,cancle()将会返回true //如果任务已经启动,执行cancle(true)将以中断执行此任务线程的方式来试图阻止任务,成功返沪true //如果任务已经启动,执行cancle(false)将不会对执行线程产生影响,此时返回falseboolean cancel(boolean mayInterruptIfRunning); //如果任务完成前被取消,返回trueboolean isCancelled(); //如果任务结束,无论是正常结束或是中途取消还是发生异常,都会trueboolean isDone(); //获取异步执行结果,如果没有结果可用,此方法会阻塞直到异步计算完成。V get() throws InterruptedException, ExecutionException; //获取异步执行结果,如果没有结果可用,此方法会阻塞, //但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
3、FutureTask类
public class FutureTask<V> implements RunnableFuture<V> {
其中
public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); }
构造方法:
public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); }
使用场景:
1、使用Callable+Future获取执行结果
package com.zejian.Executor; import java.util.concurrent.Callable; /** * @author zejian * @time 2016年3月15日 下午2:02:42 * @decrition Callable接口实例 */ public class CallableDemo implements Callable<Integer> { private int sum; @Override public Integer call() throws Exception { System.out.println("Callable子线程开始计算啦!"); Thread.sleep(2000); for(int i=0 ;i<5000;i++){ sum=sum+i; } System.out.println("Callable子线程计算结束!"); return sum; } }
package com.zejian.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @author zejian * @time 2016年3月15日 下午2:05:43 * @decrition callable执行测试类 */ public class CallableTest { public static void main(String[] args) { //创建线程池 ExecutorService es = Executors.newSingleThreadExecutor(); //创建Callable对象任务 CallableDemo calTask=new CallableDemo(); //提交任务并获取执行结果 Future<Integer> future =es.submit(calTask); //关闭线程池 es.shutdown(); try { Thread.sleep(2000); System.out.println("主线程在执行其他任务"); if(future.get()!=null){ //输出获取到的结果 System.out.println("future.get()-->"+future.get()); }else{ //输出获取到的结果 System.out.println("future.get()未获取到结果"); } } catch (Exception e) { e.printStackTrace(); } System.out.println("主线程在执行完成"); } }
执行结果:
Callable子线程开始计算啦! 主线程在执行其他任务 Callable子线程计算结束! future.get()-->12497500 主线程在在执行完成
2、使用Callable+FutureTask获取执行结果
package com.zejian.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; /** * @author zejian * @time 2016年3月15日 下午2:05:43 * @decrition callable执行测试类 */ public class CallableTest { public static void main(String[] args) { //创建线程池 ExecutorService es = Executors.newSingleThreadExecutor(); //创建Callable对象任务 CallableDemo calTask=new CallableDemo(); //创建FutureTask FutureTask<Integer> futureTask=new FutureTask<>(calTask); //执行任务 es.submit(futureTask); //关闭线程池 es.shutdown(); try { Thread.sleep(2000); System.out.println("主线程在执行其他任务"); if(futureTask.get()!=null){ //输出获取到的结果 System.out.println("futureTask.get()-->"+futureTask.get()); }else{ //输出获取到的结果 System.out.println("futureTask.get()未获取到结果"); } } catch (Exception e) { e.printStackTrace(); } System.out.println("主线程在执行完成"); } }
结果:
Callable子线程开始计算啦! 主线程在执行其他任务 Callable子线程计算结束! futureTask.get()-->12497500 主线程在执行完成
转载于:https://www.cnblogs.com/L-a-u-r-a/p/8570080.html
Callable、Future、FutureTask浅析相关推荐
- Java并发编程举例Runnable, Callable, Future, FutureTask, CompletionService
import java.util.concurrent.*;/*** Created by chenh on 2017/3/23.*/ public class ConcurrentDemo {// ...
- Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)
java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁 ...
- 如何使用Callable和FutureTask
介绍 从Java 1.5开始,在java.util.concurrent下有了新的对象集. 该程序包具有许多不同的类,包括线程队列. 当我用Java 1.2编程时,我本可以使用那些! 当我开始看这些新 ...
- java Future FutureTask 并发操作
2019独角兽企业重金招聘Python工程师标准>>> 1.1 综述 创建线程有两种方式:extends Thread || inplements Runable,但是这两种方式都有 ...
- java回调原理,以及Callable和FutureTask通过回调机制创建可监控的线程
回调的概念会JS的人应该都能理解. 回调分异步回调,同步回调.但是同步回调其实没什么意义.都同步了,那么直接等那边执行完了,这边再执行就可以了,没必要通过回调.我们说的回调主要是讲异步回调.用于两个线 ...
- Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式
一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...
- 【转载】Callable、FutureTask中阻塞超时返回的坑点
本文转载自:http://www.cnblogs.com/starcrm/p/5010863.html 案例1: package com.net.thread.future;import java.u ...
- Java线程池 / Executor / Callable / Future
为什么需要线程池? 每次都要new一个thread,开销大,性能差:不能统一管理:功能少(没有定时执行.中断等). 使用线程池的好处是,可重用,可管理. Executor 4种线程池 // 可缓存线程 ...
- callable线程池示例_Java Callable Future示例
callable线程池示例 Java Callable and Future are used a lot in multithreaded programming. In last few post ...
最新文章
- C# Aop简单扫盲及ORM实体类属性拦截示例
- 用神经网络分类响尾蛇和牛蛙
- 一步步编写操作系统 09 写个mbr
- oracle中保留2位小数的写法
- 武汉三首,记录备忘,写的不好,以后再改
- pandas 处理 csv
- SpringApplication.run方法分析
- FAT文件系统“格式化”的恢复方法
- 判断一个数字是否为素数 C++实现
- 【尚硅谷】Gradle教程入门到进阶(从gradle安装到项目实战)笔记
- C语言数据结构之一元多项式的求导
- java读取图片 去除alpha_java – 从图像中剥离Alpha通道
- B站banner图片随鼠标移动虚化效果摸索
- android三星s8底部菜单,【Android】三星Galaxy S8及S8+的屏幕适配
- 5不触发系统键盘_智能化子系统红外周界报警的基础知识介绍!
- elasticsearch for windows
- JS的严格模式和标准模式
- Get Request
- 微积分 重点难点记录
- 靶机渗透练习43-Lord Of The Root