`

java多线程编程——同步器Future和FutureTask(五)

阅读更多
public interface Future<V>Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。

Future 主要定义了5个方法:

1)boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。此方法返回后,对 isDone() 的后续调用将始终返回 true。如果此方法返回 true,则对 isCancelled() 的后续调用将始终返回 true。

2)boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。

3)boolean isDone():如果任务已完成,则返回 true。 可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回 true。

4)V get()throws InterruptedException,ExecutionException:如有必要,等待计算完成,然后获取其结果。

5)V get(long timeout,TimeUnit unit) throws InterruptedException,ExecutionException,TimeoutException:如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。



FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行。也可传递给Thread对象执行。如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。 下面的例子模拟一个会计算账的过程,主线程已经获得其他帐户的总额了,为了不让主线程等待 PrivateAccount类的计算结果的返回而启用新的线程去处理, 并使用 FutureTask对象来监控,这样,主线程还可以继续做其他事情, 最后需要计算总额的时候再尝试去获得privateAccount 的信息。


package test;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 *
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class FutureTaskDemo {
	public static void main(String[] args) {
		// 初始化一个Callable对象和FutureTask对象
		Callable pAccount = new PrivateAccount();
		FutureTask futureTask = new FutureTask(pAccount);
		// 使用futureTask创建一个线程
		Thread pAccountThread = new Thread(futureTask);
		System.out.println("futureTask线程现在开始启动,启动时间为:" + System.nanoTime());
		pAccountThread.start();
		System.out.println("主线程开始执行其他任务");
		// 从其他账户获取总金额
		int totalMoney = new Random().nextInt(100000);
		System.out.println("现在你在其他账户中的总金额为" + totalMoney);
		System.out.println("等待私有账户总金额统计完毕...");
		// 测试后台的计算线程是否完成,如果未完成则等待
		while (!futureTask.isDone()) {
			try {
				Thread.sleep(500);
				System.out.println("私有账户计算未完成继续等待...");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("futureTask线程计算完毕,此时时间为" + System.nanoTime());
		Integer privateAccountMoney = null;
		try {
			privateAccountMoney = (Integer) futureTask.get();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		System.out.println("您现在的总金额为:" + totalMoney + privateAccountMoney.intValue());
	}
}

@SuppressWarnings("all")
class PrivateAccount implements Callable {
	Integer totalMoney;

	@Override
	public Object call() throws Exception {
		Thread.sleep(5000);
		totalMoney = new Integer(new Random().nextInt(10000));
		System.out.println("您当前有" + totalMoney + "在您的私有账户中");
		return totalMoney;
	}

}



运行结果


    futureTask线程现在开始启动,启动时间为:3098040622063
    主线程开始执行其他任务
    现在你在其他账户中的总金额为56983
    等待私有账户总金额统计完毕...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    私有账户计算未完成继续等待...
    您当前有3345在您的私有账户中
    私有账户计算未完成继续等待...
    futureTask线程计算完毕,此时时间为3103072404138
    您现在的总金额为:569833345

分享到:
评论
1 楼 xfxlch 2014-04-10  
您当前有3345在您的私有账户中
私有账户计算未完成继续等待...
futureTask线程计算完毕,此时时间为3103072404138
中间的
私有账户计算未完成继续等待...
为什么会出来

相关推荐

    java多线程编程同步器Future和FutureTask解析及代码示例

    Java多线程编程中,`Future` 和 `FutureTask` 是两种重要的同步工具,它们用于管理异步计算的结果。在Java并发编程中,通常我们会使用`ExecutorService`来提交任务,而`Future`和`FutureTask`就是与这些任务交互的...

    Java分布式应用学习笔记05多线程下的并发同步器

    ### Java分布式应用学习笔记05多线程下的并发同步器 #### 1. 前言 在现代软件开发中,特别是在...总之,通过深入了解和运用`FutureTask`等并发同步器,我们可以更高效地管理多线程应用程序,提高系统的性能和稳定性。

    Java多线程编程经验谈

    Java多线程编程是Java开发中的重要组成部分,尤其对于大型应用程序和并发性能要求较高的系统而言。虽然Java在多线程方面可能不如C++灵活,但Java提供了强大的平台无关性和自动内存管理,使得开发者可以专注于并发...

    Java多线程文档

    在IT领域,尤其是在Java编程中,多...这篇文档通过深入浅出的方式讲解了Java多线程编程的核心概念、常用工具和最佳实践,对于理解和应用Java多线程有着极大的帮助。无论是初学者还是有经验的开发者,都能从中受益匪浅。

    java关于线程编程

    - 实现`Callable`接口:配合`FutureTask`使用,`Callable`接口的`call()`方法返回一个结果,适合有返回值的多线程场景。 2. **线程的状态**: - 新建(New):线程被创建但尚未启动。 - 运行(Runnable):`...

    Java多线程经典面试题68问

    Java多线程是Java编程中的核心概念,尤其在并发编程领域有着举足轻重的地位。在面试中,Java多线程问题是考察候选人技术水平的重要部分。以下是对Java多线程经典面试题的一些详细解答: 1. **什么是线程?** 线程...

    java多线程

    Java多线程是Java编程中非常重要的一个方面,它不仅可以提高程序的性能和响应能力,还可以简化程序的设计。掌握Java多线程的基本原理和使用技巧对于任何Java程序员来说都是非常必要的。通过学习本教程,你应该能够...

    java多线程设计模式详解

    Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到并发编程的核心理论和技术。这份PDF文档,"java多线程设计模式详解",提供了一种深入理解如何在Java环境中高效利用多线程并保证程序稳定性的途径。下面,...

    Java多线程并发技术的实现.pdf

    在多线程编程中,线程同步是非常重要的概念,主要用于解决线程之间的数据共享问题,防止数据竞争。 ##### 4.1 synchronized关键字 `synchronized`关键字是最常用的同步手段之一,它可以用于修饰方法或者代码块,...

    java多线程设计模式详解(PDF及源码)

    Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到并发编程、系统性能优化以及程序的稳定性。在大型分布式系统和高性能应用中,理解和熟练掌握多线程设计模式至关重要。本资源提供了详细的Java多线程设计...

    【Java核心知识面试】-java多线程50题.zip

    Java多线程是Java编程中的一个关键领域,尤其在面试中常常被重点考察。下面将对Java多线程的核心知识点进行详细的阐述。 1. **线程的创建方式**: - 继承Thread类:创建一个新的类,继承自Thread类,并重写其run()...

    java实现线程的异步

    Java 实现线程异步是程序设计中的一个重要概念,它涉及到多任务并行处理和非阻塞执行。在Java中,我们可以通过多种方式来实现线程的异步操作,以提高程序的执行效率和响应速度。 一、Java Thread 类 Java Thread 类...

    40道常问的Java多线程面试题!.zip

    Java多线程是Java编程中的核心概念,尤其在大型企业级应用中不可或缺。这40道常问的Java多线程面试题可以帮助我们深入理解这一关键领域的知识。下面,我们将详细探讨这些面试题可能涉及的关键知识点。 1. **线程与...

    Java并发编程实战

    6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现页面渲染器 6.3.7 为任务设置时限 6.3.8...

    《Java并发编程实战》PDF版本下载.txt

    《Java并发编程实战》一书系统地介绍了Java并发编程的基础知识和高级特性,并通过大量实战案例帮助读者理解和掌握Java并发编程技术。通过学习本书,开发者可以更好地利用多核处理器的优势,提高应用程序的性能和响应...

    Java面试题-线程多线程.pdf

    在Java编程中,线程多线程是核心概念之一,尤其在面试中经常被问到。下面我们将深入探讨这些知识点。 首先,我们来看Java中的线程创建方式: 1. **Thread 类的子类化**:通过继承 `Thread` 类并重写 `run()` 方法...

    java线程代码

    线程同步是解决多线程间数据竞争问题的关键。Java提供了synchronized关键字来实现线程同步,它可以修饰方法或代码块,确保同一时间只有一个线程可以访问特定代码。 ```java public synchronized void method() { /...

    javase之多线程技术

    Java中的多线程技术是Java进阶学习的重要组成部分,它涉及到并发编程的理论与实践,旨在提高程序的执行效率和响应速度。以下是对多线程技术的详细解释: 1. **CPU调度算法原理** - **先来先服务(FCFS)**:按照...

Global site tag (gtag.js) - Google Analytics