线程(七)CallableAndFuture
来源:互联网 发布:php的就业前景好 编辑:程序博客网 时间:2024/04/30 03:27
我们在前面的总结中的所有的线程的使用,大家有没有觉的有一个问题就是我们得不到线程的执行的返回的结果,这个是不是有点然人懊恼,对的我们只是创建了线程去执行,但是我们没有获取到他的返回值,在有些时候这个是不必须的,但是如果我们 需要线程的执行结果呢,我们需要线程的执行结果加以运算之类的,怎么办,别着急,我们还有方法可以取到线程的执行结果的,那就是Callable,Callable就是帮助我们获取到线程的执行结果,我们在使用Callable的时候需要重写他的Call()方法.在使用Callable的时候我们配合的使用Future,那么我们就可达到这样的效果:我们的线程在执行一些费时的操作,我们可以先把线程装进我们的一个容器里,等到我们需要的时候我们直接从容器中取结果就OK;下面我们来看下我们的代码
public class CallableAndFuture { public static void main(String[] args) { //创建一个线程返回随机的Int值 Callable callable = new Callable() { @Override public Object call() throws Exception { return new Random().nextInt(); } }; FutureTask task = new FutureTask(callable); new Thread(task).start(); try { //等待的结果我们可以做很多事情 Thread.sleep(5000); //阻塞等待 结果返回 System.out.println(task.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }}我们可以看到我们时候用的是 FutureTask 这个容器来装在我们的线程,最后调用他的Task方法就可以取得线程执行的结果了.FutureTask实现了Runable接口和Future接口,那么说名他可以执行我们的线程也可以获取我们线程的执行 结果,Future里面有很多的线程相关的方法,大家可以进去看看源码,检测函数和获取结果函数等等
下面我们在使用一个线程池的方式来卡看我们的Callable和Future的使用:
public class CallableAndFutrue2 { public static void main(String[] args) { //创建一个线程池,需要几个就创建几个的线程池 ExecutorService service = Executors.newCachedThreadPool(); //用来存储线程结果 List<Future> futures = new ArrayList<Future>(); //创建5个线程加入队列阻塞获取 for (int i = 0; i < 5; i++) { Callable callable = new Callable() { @Override public Object call() throws Exception { return new Random().nextInt(); } }; Future future = service.submit(callable); futures.add(future); } for (Future future : futures) { try { System.out.println(future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }}我们 创建一个Future容器来装在我们的线程执行结果,最后遍历这个容器就可以取得结果了.我们 使用的是上一节我们总结的newCachedThreadPoll当时创建的线程池.
1 0
- 线程(七)CallableAndFuture
- CallableAndFuture
- CallableAndFuture
- 多线程编程5----一个线程执行完返回值CallableAndFuture.java
- JAVA CallableAndFuture CompletionService
- 七、线程
- 七、线程操作
- 线程休眠(七)
- Java线程(七)-线程的调度
- 线程学习笔记(七)-线程优先级
- python线程加锁(七)
- 七(7.6 ) 线程的执行时间
- 线程(七)信号量 Semaphore
- 线程的七种状态
- python 线程相关 (七)
- java 线程七-Lock锁
- 并发编程七:线程通信
- zthread学习 实例七 线程本地存储
- 跟我一起写shell补全脚本(Zsh篇)
- ES6入门——Set和Map数据结构
- scala 叠加在一起的特质 举例
- cocos2dx坐标体系详解
- 敏捷故事 4小时产品上线
- 线程(七)CallableAndFuture
- Oracle中导出一条记录的SQL
- ES6入门 —— Class和Module
- App推广平台有哪些
- 进程与线程之间的关系与区别分析
- 剑指offer——斐列那契数列(递归)
- 16.7.3菲波那契数列
- centos 用nat连接的方式,
- bootstrap