多线程编程(六)--Callable&Future

Thread类和Runnable接口和Java内存管理模型使得多线程编程简单直接。但是Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值。

Callable接口和Future接口的引入以及它们对线程池的支持优雅的解决了这两个问题。

Callable接口类似于Runnable接口,Callable接口被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值。Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。

1、Callable要采用ExecutorService的submit方法提交,返回的future对象可以取消任务

代码:

public static void main(String[] args) {
		ExecutorService threadPool = Executors.newSingleThreadExecutor();
		// submit是提交以便返回结果
		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();
		}
}

结果:

Executor使我们无需显示的去管理线程的生命周期。

2、执行多个带返回值的任务,并取得多个返回值

  //方式2 CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象
		//好比我同时种了几块地的麦子,然后就等待收割。收割时,则是那块先成熟了,则先去收割哪块麦子。
		ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
		CompletionService<Integer> compeletionService = new ExecutorCompletionService<Integer>(
				threadPool2);
		for (int i = 0; i <= 10; i++) {
			final int seq = i;
			compeletionService.submit(new Callable<Integer>() {
				@Override
				public Integer call() throws Exception {
					Thread.sleep(new Random().nextInt(5000));
					return seq;
				}
			});
		}
		for (int i = 0; i < 10; i++) {
			try {
				//产生线程,返回结果再把结果拿回来
				System.out.println(compeletionService.take().get());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

结果:

3、了解Callable接口以及Future接口

Callable接口与Runnable接口的区别

1)Callable定义的方法时call,而Runnable定义的方法是run

2)Callable的call方法可以由返回值,而Runnable的run方法不能有返回值

3)Callable的call方法可以抛异常,而Runnable的run方法不能抛异常

Future表示一步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。Future的calcel方法可以取消任务的执行,它有一布尔参数,参数为true表示立即终端任务的执行,参数为false表示允许正在运行的任务运行完成。Future的get方法等待计算完成,获取计算结果。

时间: 2024-10-22 21:34:51

多线程编程(六)--Callable&Future的相关文章

Java多线程编程:Callable、Future和FutureTask浅析

通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从Java SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口.

多线程编程(六)-Executor与ThreadPoolExecutor的使用

使用Executors工厂类创建线程池 1.使用newCachedThreadPool()方法创建无界线程池 newCachedThreadPool()方法创建的是无界线程池,可以进行线程自动回收,此类线程池中存放线程个数理论值为Integer.MAX_VALUE最大值. package com.wjg.unit4_2_2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; pu

Java多线程编程中Future模式的详解&lt;转&gt;

Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下:关于其他多线程设计模式的地址如下:关于Master-Worker模式的详解: Java多线程编程中Master-Worker模式的详解关于Guarded Suspeionsion模式的详解: Java多线程编程中Guarded Suspeionsion模式

Java并发编程:Callable、Future和FutureTask(转)

Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callabl

15、Java并发编程:Callable、Future和FutureTask

Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callabl

[转载] Java并发编程:Callable、Future和FutureTask

转载自http://www.cnblogs.com/dolphin0520/p/3949310.html 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果.

Java并发编程:Callable、Future和FutureTask

原文链接:http://www.cnblogs.com/dolphin0520/  作者:海子 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就

Java并发编程:Callable、Future和FutureTask及在项目中的引用

在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callable.Future和FutureTask三个类的使用方法.以下是本文的目录

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android