`

Callable与Future应用

    博客分类:
  • J2SE
阅读更多

应用于异步的任务执行,类似JS的回调方法.

Future取得的结果类型与Callable返回的结果类型必须一致.

如异步执行方式:

public class FutureTaskDemo {

	public static void main(String[] args) {
		// 初始化一个Callable对象和FutureTask对象
		Callable<Object> pAccount = new PrivateAccount();
		FutureTask<Object> futureTask = new FutureTask<Object>(pAccount);
		// 使用FutureTask创建一个线程
		Thread pAccountThread = new Thread(futureTask);
		System.out.println("future task starts at " + System.nanoTime());
		
		pAccountThread.start();
		// 主线程执行自己的任务
		System.out.println("main thread doing something else here.");
		// 从其他帐户获取总金额
		int totalMoney = new Random().nextInt(100000);
		System.out.println(" You have " + totalMoney + " in your other Accounts. ");
		System.out.println(" Waiting for data from Private Account");
		// 测试后台的就计算线程是否完成,如果未完成,等待
		while(!futureTask.isDone()){
			try {
				Thread.sleep(5);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("future task ends at " + System.nanoTime());
		Integer privataAccountMoney = null;
		// 如果后台的FutureTask计算完成,则返回计算结果
		try {
			privataAccountMoney = (Integer) futureTask.get();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		System.out.println(" The total money you have is " + (totalMoney + privataAccountMoney.intValue()));
	}

}

// 创建一个Callable类,模拟计算一个私有帐户中的金额
class PrivateAccount implements Callable<Object> {
	
	Integer totalMoney;
	@Override
	public Integer call() throws Exception{
		Thread.sleep(5000);
		totalMoney = new Integer(new Random().nextInt(10000));
		System.out.println(" You have " + totalMoney + " in your private Account. ");
		return totalMoney;
	}
	
}

 采用ExecutorSevice的submit方法提交:

public class CallableAndFuture {

	public static void main(String[] args) {
		// Future(将来)取得的结果类型和Callable返回的结果类型必须一致.
		// Callable要采用ExecutorSevice的submit方法提交,返回的future对象可以取消任务.
		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) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		threadPool.shutdown();
		
		// CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务
		// 对应的Future对象,好比N块麦子,谁先成熟先收。
		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=0;i<10;i++){
			try {
				// 先完成的先得到
				System.out.println(completionService.take().get());
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
		}
		
		threadPool2.shutdown();
	}
	
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Callable:Callable与Future在Web应用中的优化案例

    在Java编程中,Callable接口和Future接口是多线程编程中的重要工具,它们在Web应用程序的性能优化中扮演着关键角色。本篇文章将深入探讨Callable和Future如何在Web应用中提高效率并优化资源利用。 Callable接口是...

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

    Java并发编程Callable与Future的应用实例代码 在Java并发编程中,Callable与Future是两个非常重要的概念,它们通常结合使用来实现异步编程。在本文中,我们将详细介绍Callable与Future的应用实例代码,并探究它们在...

    Callable和Future.doc

    Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...

    详解JDK中ExecutorService与Callable和Future对线程的支持

    Java并发编程中的ExecutorService、Callable和Future ...在实际应用中,我们可以使用ExecutorService、Callable和Future来实现各种并发编程任务,如统计某个盘子的大小、统计多个盘子的总大小、实现高效的数据处理等。

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    `Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...

    JAVA中Callable的使用

    与Runnable接口相比,Callable接口提供了更强大的功能,因为Runnable只能定义无返回值的任务,而Callable可以定义有返回值的任务。这篇教程将深入探讨如何在Java中使用Callable。 Callable接口位于`java.util....

    详解Java Callable接口实现多线程的方式

    Callable和Future接口广泛应用于多线程编程中,例如: * 网络编程:使用Callable和Future可以实现异步网络请求,并获取执行结果。 * 数据处理:使用Callable和Future可以实现并发数据处理,并获取执行结果。 * 图像...

    concurrent-csv-parser:使用 Executor 和 Callable-Future 进行并发任务处理

    技术方案基于ExecutorService、Callable、Future等高级Java并发API。 技术栈 JDK 8 Apache Maven v.3.2 构建说明 从应用程序根目录调用以下 maven 命令: mvn clean package 检查构建日志,确保构建成功: ...

    Java中的Callable接口最全讲义

    目录: 简介 Callable接口的基本用法 2.1 创建Callable任务 2.2 提交Callable任务 2.3 获取任务执行结果 Future接口的使用 3.1 获取任务执行状态 3.2 取消任务的执行 ...Callable的应用场景 最佳实践与注意事项

    【Java】Callable创建线程用到的适配器模式(csdn)————程序.pdf

    本文将详细解释Callable接口的使用、适配器模式在创建线程中的应用,以及FutureTask在其中的角色。 首先,Callable接口与Runnable接口类似,都是用于创建新线程的接口。但是,Runnable接口的run()方法无返回值,而...

    Java多线程实现的四种方式

    在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...

    比较java中Future与FutureTask之间的关系

    Future与FutureTask之间的关系 在Java中,Future和FutureTask都是用于获取线程执行的返回结果,但是它们之间存在一些差异和关联。本文将详细介绍Future和FutureTask的关系、使用和分析。 一、Future介绍 Future...

    JAVA多线程实现和应用总结

    Java多线程是编程中一个...而ExecutorService、Callable和Future的组合则提供了更高级的功能,如线程池管理、异步计算和结果获取,适用于复杂并发环境。在实际开发中,合理利用这些特性可以提高程序的效率和可维护性。

    Java中Future、FutureTask原理以及与线程池的搭配使用

    3. `&lt;T&gt; Future&lt;T&gt; submit(Callable&lt;T&gt; task)`:直接将`Callable`包装为`FutureTask&lt;T&gt;`并执行。 `FutureTask`的实现包括了任务状态的管理、中断处理和异常传播等复杂逻辑,确保了异步任务的正确执行和结果获取。...

    Java多线程之Callable接口的实现

    Callable接口与Runnable接口的区别在于Callable接口可以返回结果并抛出异常,而Runnable接口不能返回结果也不能抛出异常。 在实现Callable接口时,我们需要重写call()方法,该方法定义了要执行的任务。例如,我们...

    异步编程的瑞士军刀:Java中Future和Callable接口的妙用

    Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。...5. **网络编程**:Java提供了丰富的网络通信API,使得开发网络应用变得容易。 6. **安全性**:Java提供了一个安全

    future.zip

    在Java编程中,`Future`接口是并发处理的一个关键概念,它是`java.util.concurrent`包的一部分,与`ExecutorService`和`Callable`一起构成了Java并发编程的重要基石。本文将详细解析`Future`接口及其在实际编程中的...

    Java多线程之异步Future机制的原理和实现共5页.p

    异步Future机制通常与ExecutorService和Callable接口一起使用。ExecutorService是一个线程池服务,可以提交任务并管理它们的生命周期。Callable接口类似于Runnable,但是它允许任务有返回值。 下面是一个简单的...

    Java多线程实现Callable接口

    通过以上知识点,我们可以看到Callable接口在Java多线程中的应用,它可以方便地处理返回值,并且与ExecutorService结合,提供了强大的并发处理能力。在实际开发中,特别是在大数据处理、计算密集型任务等场景下,...

    Java多线程与并发库高级应用

    为了更好地理解Java多线程与并发库的实际应用,我们可以考虑一个具体的案例——使用`ExecutorService`和`Future`实现一个简单的下载文件并合并的功能。 假设我们需要从网络上下载多个小文件,并将它们合并成一个大...

Global site tag (gtag.js) - Google Analytics