java多线程系列(七)—Callable、Future和FutureTask详解编程语言
不同的是Callble接口call方法有返回值,返回的是传进来的V类型,而Runnable接口run方法无返回值
Futurue是一个接口,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future ? 形式类型、并返回 null 作为底层任务的结果。
Cancel方法:试图取消任务的执行,如果任务已完成或者已取消或者无法取消,则返回false。如果任务尚未启动,执行此方法后,将不会再运行。如果任务已经启动,则可以选择参数确定是否尝试停止任务
boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; } FutureTask
FutureTask是一个类,实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future接口
public class FutureTask V implements RunnableFuture V { public FutureTask(Callable V callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable } public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable } } public interface RunnableFuture V extends Runnable, Future V { void run(); }AbstractExecutorService的submit方法
对比ThreadPoolThread的execute方法,execute无返回值,而三个submit方法返回的都是Future,可以获取任务执行结果,还可以取消任务
ThreadPoolExecutor tp = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue Runnable (10)); Future String future=tp.submit(new Callable String () { public String call() throws Exception { // TODO 自动生成的方法存根 return jiajun } }); tp.shutdown(); try { System.out.println(future.get()); System.out.println(future.isCancelled()); System.out.println(future.isDone()); System.out.println(future.cancel(true)); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (ExecutionException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }
ThreadPoolExecutor tp = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue Runnable (10)); FutureTask String future= new FutureTask String (new Callable String () { public String call() throws Exception { // TODO 自动生成的方法存根 return jiajun } }); tp.submit(future); tp.shutdown(); try { System.out.println(future.get()); System.out.println(future.isCancelled()); System.out.println(future.isDone()); System.out.println(future.cancel(true)); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (ExecutionException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }
不同的地方,从代码可以看出第一份代码中future作为submit方法的返回值,而第二份代码,futureTask作为submit方法的参数。
Callable和Runable都是接口,二者作用类似,不同的是Callable有返回值,而Runnable无返回值
有时候并不需要返回值,但是由于需要可取消任务,所以使用submit方法而不使用execute方法
FutureTask是一个类,实现了RunnableFuture接口(继承了Runnable和Future接口),FutureTask可以做为submit方法的参数,并通过FutureTask可以查看任务执行状态
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15333.html
cjava相关文章
- fileinputstream java_Java FileInputStream close()方法
- java编译命令是什么_Java编译命令整理
- java出现中文乱码_Java开发中中文乱码总结
- java标识符是什么_Java 标识符「建议收藏」
- java arraydeque poll,Java ArrayDeque「建议收藏」
- 各窗口共同卖票 【 Java 多线程 】
- java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
- Java 多线程并发编程之互斥锁 Reentrant Lock详解编程语言
- Java学习笔记之五java数组详解编程语言
- 服务Linux启动Java服务:一步步去完成(linux启动java)
- 深入Java:利用API快速创建MySQL表(java创建mysql表)
- Java多线程(三):synchronized关键字详解编程语言
- Java多线程(四):synchronized关键字续详解编程语言
- Java多线程(五):线程等待与唤醒详解编程语言
- 【Java】使用socket实现控制台多线程聊天室详解编程语言
- 40个Java多线程问题总结详解编程语言
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型详解编程语言
- Java多线程16:线程组详解编程语言
- Java多线程14:生产者/消费者模型详解编程语言
- Java多线程8:wait()和notify()/notifyAll()详解编程语言
- Linux下配置Java环境变量的简易指南(linux配置java环境变量)
- 多线程Redis Java中多线程过期数据处理(redisjava过期)
- Java面试中的Redis题目剖析(java面试题redis)
- 基于Java多线程notify与notifyall的区别分析
- 解决java查看JDK中底层源码的实现方法
- java多线程编程之使用runnable接口创建线程