博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android多线程的研究(8)——Java5于Futrue获取线程返回结果
阅读量:6079 次
发布时间:2019-06-20

本文共 2905 字,大约阅读时间需要 9 分钟。

我们先来看看ExecutorService操作的方法:

在上一篇中我们使用了execute方法启动线程池中的线程运行,这一篇我们来看看submit方法的使用:submit提交一个返回值的任务用于运行,返回一个表示任务的未决结果的 Future。

该 Future 的 get 方法在成功完毕时将会返回该任务的结果。

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableAndFutrue {	public static void main(String[] args) throws InterruptedException, ExecutionException {		ExecutorService threadPool = Executors.newSingleThreadExecutor();		Future
future = threadPool.submit(new Callable
() { @Override public String call() throws Exception { Thread.sleep(2000); return "阳光小强"; } }); System.out.println(future.get()); }}
在上面代码中我们启动了一个线程,休眠了2秒后返回结果“阳光小强"

import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableAndFutrue {	public static void main(String[] args) throws InterruptedException, ExecutionException {		ExecutorService threadPool = Executors.newSingleThreadExecutor();		Future future = threadPool.submit(new Runnable(){						@Override			public void run() {				try {					Thread.sleep(2000);				} catch (InterruptedException e) {					e.printStackTrace();				}			}		});				System.out.println(future.get());	}}
提交一个 Runnable 任务用于运行。并返回一个表示该任务的 Future。该 Future 的
get 方法在
成功 完毕时将会返回
null

再看看最后一个submit。能够加入一个result,当线程运行完毕后会返回该result

Future future = threadPool.submit(new Runnable(){						@Override			public void run() {				try {					Thread.sleep(2000);				} catch (InterruptedException e) {					e.printStackTrace();				}			}		}, "阳光小强");
假设我们提交多个任务(也就是开启多个线程)后怎样有序的返回结果呢?

将生产新的异步任务与使用已完毕任务的结果分离开来的服务。

生产者 submit 运行的任务。使用者 take 已完毕的任务,并依照完毕这些任务的顺序处理它们的结果。比如。CompletionService 能够用来管理异步 IO ,运行读操作的任务作为程序或系统的一部分提交,然后。当完毕读操作时。会在程序的不同部分运行其它操作。运行操作的顺序可能与所请求的顺序不同。

通常。CompletionService 依赖于一个单独的 来实际运行任务。在这样的情况下。CompletionService 仅仅管理一个内部完毕队列。 类提供了此方法的一个实现。

 

import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorCompletionService;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CallableAndFutrue {	public static void main(String[] args) throws InterruptedException, ExecutionException {		ExecutorService threadPool = Executors.newFixedThreadPool(10);		ExecutorCompletionService
ecs = new ExecutorCompletionService<>(threadPool); for(int i=0; i<10; i++){ final int seq = i; ecs.submit(new Callable
() { @Override public Integer call() throws Exception { Thread.sleep(new Random().nextInt(5000)); return seq; } }); } for(int i=0; i<10; i++){ System.out.println(ecs.take().get()); } }}

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
有关异或符号'^'在c++编程中的应用的讲解!!!
查看>>
迷宫求解终结版(堆栈的使用)第三季
查看>>
字符串操作【转】
查看>>
ASYNC PROGRAMING IN JAVASCRIPT[转]
查看>>
几扇鲜为人知的Windows XP自动运行后门
查看>>
电子书下载:Construct Game Development Beginner's Guide
查看>>
此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决办法方案
查看>>
git学习笔记(二)—— 创建版本库&&版本管理
查看>>
.Net Remoting(应用程序域) - Part.1
查看>>
windows server 2008下的一些设置技巧及优化
查看>>
[置顶] lvs-tun隧道模式搭建
查看>>
PHP ADLogin
查看>>
Web服务器 之 Debian下给apache加载ssl
查看>>
CTreeCtrl控件使用技巧
查看>>
第三届云计算大会 - Dell云计算: 企业的有效转型策略(转载)
查看>>
关于延迟时间的一点智慧
查看>>
33.NET对加密和解密的支持
查看>>
MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件02-多文件上传...
查看>>
jQuery显示和隐藏 常用的状态判断方法
查看>>
[翻译]Shape comparison language
查看>>