`
Lucas_
  • 浏览: 4790 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java并发编程:Callable&Future

 
阅读更多

Java并发编程:Callable&Future

在之前的线程中,执行完任务之后无法获取执行结果。

如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。

而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

 

用一个简单的例子说明用法:

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class CallableAndFuture{
	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newSingleThreadExecutor();
		Future<String> future = 
		threadPool.submit(
			 new Callable<String>() {
				 public String call() throws Exception {
					Thread.sleep(2000);
					return "hello";
				 };
			 }
		);
		
		System.out.println("等待结果.......");
		try {
			System.out.println("等到结果:" + future.get());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	/*
	 	CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象
	 	执行threadPool2池子中的任务
	*/
		ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
		CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);
		
		for(int i=1; i<=10; i++){		

			final int seq = i;
			completionService.submit(new Callable<Integer>() {   
				@Override
				public Integer call() throws Exception {
					Thread.sleep(new Random().nextInt(5000));
					return seq;
				}
			});
		}
	
		for(int i=1; i<=10; i++){
			try {
				System.out.println(completionService.take().get());  //取出已经完成的任务
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

 

 

分享到:
评论

相关推荐

    Java并发编程实战

    6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...

    Java并发编程Callable与Future的应用实例代码

    主要介绍了Java并发编程Callable与Future的应用实例代码,具有一定借鉴价值,需要的朋友可以参考下

    Java 并发编程实战

    6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换? 线程和进程区别 什么是线程和进程? 创建线程有哪几种方式?,如何避免线程死锁 线程的 run()和 start()有什么区别? 什么是 ...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    2万字Java并发编程面试题合集(含答案,建议收藏)

    2万字Java并发编程面试题合集(含答案,建议收藏) 具体如下 1、在 java 中守护线程和本地线程区别?2、线程与进程的区别?3、什么是多线程中的上下文切换?4、死锁与活锁的区别,死锁与饥饿的区别?5、Java 中用到...

    【并发编程】 — Runnable、Callable、Future和FutureTask之间的关系

    2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    什么是Java中的面向对象编程(OOP)?列举OOP的原则。...什么是Java中的并发编程?列举一些常见的并发类和工具。 什么是Java中的线程池?如何创建和使用线程池? 什么是Java中的Callable和Future接口?如何使

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    并发编程笔记20190526.docx

    4、Callable、Future和FutureTask 30 5、原子操作CAS (compare atomic swap) 32 三、显式锁和AQS 34 1、AQS定义两种资源共享方式: 34 2、深入源码 37 3、了解Condition的实现 42 4、 锁的可重入 44 第三章 并发容器...

    使用Java异步编程实现一个简单的网络请求.txt

    这个代码实现了一个简单的网络请求,使用了Java中的异步编程模型。 首先,我们定义了一个URL地址和一个超时时间(TIMEOUT...这个例子展示了如何使用Java异步编程模型来实现并发的网络请求,可以提高程序的效率和性能。

    常用Java代码65个附示例代码

    8.Java中的Future和Callable接口 9.Java中的异常传播 10.Java中的断言(Assertions) 11.Java中的泛型(Generics) 12.Java中的反射(Reflection) 13.Java中的序列化(Serialization) 14.Java中的多线程编程...

    corejava培训文档

    1. 前言 1.1. JAVA特点 1.2. 运行原理 1.3. JAVA目录 2. 一 基础知识 2.1. 配置环境 2.2. Java中基本概念 3. 二 定义,关键字和类型 3.1. 注释的三种形式 3.2. Java代码中的“;...17.10. Callable 和 Future接口

    java学习笔记 初学者必读

    1. 前言 1-4 1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 ...17.10. Callable 和 Future接口 17-74

    concurrent-merge-sort

    并发编程。 2.基本的Spring IoC框架。 3.使用日志记录。 相同算法有两种不同的实现方式来演示并发实现。 第一个是edu.ncsu.mhthakka.concurrent.callable.mergesort.CallableMergeSorter这是一个实现合并排序的类...

    corejavaNoteBook

    1. 前言 1-4 1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 ...17.10. Callable 和 Future接口 17-74

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    javaSE代码实例

    第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 ...

Global site tag (gtag.js) - Google Analytics