Android多线程的研究(8)——Java5于Futrue获取线程返回结果
我们先来看看ExecutorService操作的方法:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
在上一篇中我们使用了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<String> future = threadPool.submit(new Callable<String>() { @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 依赖于一个单独的 Executor
来实际运行任务。在这样的情况下。CompletionService 仅仅管理一个内部完毕队列。ExecutorCompletionService
类提供了此方法的一个实现。
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<Integer> ecs = new ExecutorCompletionService<>(threadPool);
for(int i=0; i<10; i++){
final int seq = i;
ecs.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++){
System.out.println(ecs.take().get());
}
}
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
Android多线程的研究(8)——Java5于Futrue获取线程返回结果的更多相关文章
- Android多线程研究(8)——Java5中Futrue获取线程返回结果
我们先来看一下ExecutorService中的执行方法: 在上一篇中我们使用了execute方法启动线程池中的线程执行,这一篇我们来看看submit方法的使用:submit提交一个返回值的任务用于执 ...
- “全栈2019”Java多线程第四章:设置和获取线程名称
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java多线程初学者指南(8):从线程返回数据的两种方法
从线程中返回数据和向线程传递数据类似.也可以通过类成员以及回调函数来返回数据.但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪. 一.通过类变量和方法返回数据 使用这种方法返回数 ...
- 【重学Java】多线程基础(三种创建方式,线程安全,生产者消费者)
实现多线程 简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 并发和并行[理解] 并行:在同一时刻, ...
- Android多线程研究(6)——多线程之间数据隔离
在上一篇<Android多线程研究(5)--线程之间共享数据>中对线程之间的数据共享进行了学习和研究,这一篇我们来看看怎样解决多个线程之间的数据隔离问题,什么是数据隔离呢?比方说我们如今开 ...
- android 多线程
本章讲述在android开发中,多线程的应用.多线程能够处理耗时的操作并优化程序的性能.本章主要介绍知识点,AsyncTask,Java线程池,ThreadPoolExecutor线程池类.本章案例只 ...
- Android多线程及异步处理问题
1.问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2.问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到 ...
- Android Activity launchMode研究
Android Activity launchMode研究 Activity的Launch mode一共有四种: standard, singleTop, singleTask, singleInst ...
- Android多线程编程之AsyncTask
进程?线程? 进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态的概念.每个进程都有自己的地址空间(进程空间).进程空间的大小与处理机位数有关.进程至少有5种基本状态:初始态,执行态 ...
随机推荐
- hdu-4418-Time travel-高斯+概率dp
把N个点先转化为2*N-2个点. 比方说把012345转化成0123454321. 这样,就能够找出随意两两个点之间的关系. 然后依据关系能够得出来一个一元多项式的矩阵. 然后就用高斯消元求出矩阵就可 ...
- LIS(最长的序列)和LCS(最长公共子)总结
LIS(最长递增子序列)和LCS(最长公共子序列)的总结 最长公共子序列(LCS):O(n^2) 两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1 ...
- oracle 之 内存—鞭辟近里(二)
overview of the pga pga是在操作系统的进程或是线程特定的一块内存区域,它不是共享的.因为pga是进程指定的,因此它不会在sga中分配. pga是一个内存堆,其中包含了被专用服务器 ...
- [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)
先来说一下我们学校的网站: http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html 查询成绩需要登录,然后显示各学科成绩,但是只显示成绩而没有绩点,也就是 ...
- ASP.NET MVC的跳转攻击问题
在ASP.NET MVC的自带的模板代码中,有这样一段,用来拦截非登录用户,使其跳转到登录页面,然后登录后在跳转回原页面.所以,期间有一个returnUrl参数用来保存原页面地址.在Login Act ...
- CSS实现输入框的高亮效果-------Day50
又到周末了,这一天天过的真快,明天应该回老家了.不知道会不会有机会进行编写.尽量争取吧,实在不想就这样间断.假设说从前会一天天无聊到爆,那如今自己应该是一天天忙的要死,欠缺了太多东西,那些浪费的时间可 ...
- openjpa框架入门_Demo概览(一)
我个人所了解并学习的openjpa日志(一) 最近一直研究openjpa,想把自己所了解的写成日志,和大家一起学习,一起进步. 整个过程,会有一个完整的经过改造过openbook demo可运行. O ...
- 日期格式化标签<fmt:formatDate>&<fmt:setTimeZone>时区标签的使用demo
日期格式化标签<fmt:formatDate>&<fmt:setTimeZone>时区标签的使用demo <%@ page contentType="t ...
- SE 2014年5月25日
如图配置 两实验 R1模拟总部,R2 与R3模拟分部 实验一 要求使用 IPSec VPN 主模式,使得总部与两分部内网可相互通讯 步骤: 1. 配置默认路由 [RT1]ip route-stat ...
- 读取数据表中第m条到第n条的数据,SQL语句怎么写?
原文:读取数据表中第m条到第n条的数据,SQL语句怎么写? 对于MySQL或者Oracle来说,如果实现从Table 表中取出第 m 条到第 n 条的记录操作,我们需要TOP函数(不是所有的数据库都支 ...