Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)
java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
java&android线程池-Executor框架之ThreadPoolExcutor&ScheduledThreadPoolExecutor浅析(多线程编程之三)
Java多线程:Callable、Future和FutureTask浅析(多线程编程之四)
通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从JAVA SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口。
public interface Runnable {public abstract void run();
}
而Callable的接口定义如下
public interface Callable<V> { V call() throws Exception;
}
该接口声明了一个名称为call()的方法,同时这个方法可以有返回值V,也可以抛出异常。嗯,对该接口我们先了解这么多就行,下面我们来说明如何使用, 前篇文章我们说过,无论是Runnable接口的实现类还是Callable接口的实现类,都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行, ThreadPoolExecutor或ScheduledThreadPoolExecutor都实现了 ExcutorService接口, 而因此 Callable需要和Executor框架中的ExcutorService结合使用,我们先看看ExecutorService提供的方法:
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
public static Callable<Object> callable(Runnable task)
public static <T> Callable<T> callable(Runnable task, T result)
public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
public class FutureTask<V> implements RunnableFuture<V> {
FutureTask类实现了RunnableFuture接口,我们看一下RunnableFuture接口的实现:
public interface RunnableFuture<V> extends Runnable, Future<V> {void run();
}
下面我们再来看看FutureTask的方法执行示意图(方法和Future接口基本是一样的,这里就不过多描述了)
public FutureTask(Callable<V> callable) {
}
public FutureTask(Runnable runnable, V result) {
}
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;@Overridepublic 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;}
}
Callable执行测试类如下:
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
主线程在执行完成
|
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();
// //提交任务并获取执行结果
// Future<Integer> future =es.submit(calTask);
// //关闭线程池
// es.shutdown();//创建线程池ExecutorService es = Executors.newSingleThreadExecutor();//创建Callable对象任务CallableDemo calTask=new CallableDemo();//创建FutureTaskFutureTask<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
主线程在执行完成
|
Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)相关推荐
- Callable、Future、FutureTask浅析
1.Callable<V>接口 Runnable接口 public interface Runnable { public abstract void run(); } Callable ...
- 15、Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...
- futuretask java 并发请求_Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...
- Java高并发编程:Callable、Future和FutureTask
1. Callable 泛型接口,用于获取线程执行完的结果,Callable的声明如下 public interface Callable<V> {// 返回 V 类型的结果V call( ...
- Java并发编程:Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就 ...
- Java多线程编程中Future模式的详解
转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...
- Java中的Runnable、Callable、Future、FutureTask
Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------- ...
最新文章
- Juce源代码分析(一)Juce的优势
- C++二维数组讲解、二维数组的声明和初始化
- 再次学习mysql优化
- tensorflow中的Supervisor
- linux c 11 运行库,11.1.3 运行库与I/O
- excel分段排序_学会这个神操作,报表填报不再五花八门,效率远超Excel
- 一文理清散乱的物联网里开发者必须关注的技术!
- Java Recruitment(1)
- MoFi 路由器10个后门还剩4个未修复
- 9-10 原生安装 2
- TypeError: unorderable types: str() = int()
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_12 注入集合数据
- bzoj4516 [Sdoi2016]生成魔咒
- NAS网络存储器(转)
- 美食杰-菜谱大全(二)
- 《创业算法》4: 不能太相信技术的壁垒
- OpenGL ES 与原生窗口之间的接口——EGL
- 爬取网易云的音乐信息
- Fail to allocate bitmap
- 深度学习 tensorflow 三维矩阵乘法(batch 迭代必须搞懂的矩阵乘法,维度增加)