JUC-FutureTask

得到别的线程任务的返回值

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; @Slf4j
public class FutureExample {
static class MyCallable implements Callable<String> {
@Override
public String call() throws Exception{
log.info("do something in callable");
Thread.sleep(500);
return "Done";
}
}
public static void main(String[] args) throws Exception{
ExecutorService executorService= Executors.newCachedThreadPool();
Future<String> future= executorService.submit(new MyCallable());//提交任务
log.info("do something in main");
Thread.sleep(1000);
String result=future.get();
log.info("result:{}",result);
}
}
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; @Slf4j
public class FutureTaskExample {
public static void main(String[] args) throws Exception{
FutureTask<String> futureTask=new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
log.info("do something in callable");
Thread.sleep(500);
return "Done";
}
}); new Thread(futureTask).start();
log.info("do something in main");
Thread.sleep(1000);
String result=futureTask.get();
log.info("result:{}",result);
}
}


实现代码示例:
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
@Slf4j
public class ForJoinTaskExample extends RecursiveTask<Integer>{
public static final int threshold=2;
private int start;
private int end; public ForJoinTaskExample(int start,int end){
this.start=start;
this.end=end;
}
@Override
protected Integer compute(){
int sum=0;
//如果任务足够小,就计算
boolean canCompute=(end-start)<=threshold;
if(canCompute){
for(int i=start;i<=end;i++){
sum+=i;
}
}else {
//如果任务大于阀值,就分裂成两个子任务计算
int middle=(start+end)/2; ForJoinTaskExample leftTask=new ForJoinTaskExample(start,middle);
ForJoinTaskExample rightTask=new ForJoinTaskExample(middle+1,end); //执行子任务
leftTask.fork();
rightTask.fork(); //等待任务执行结束合并结果
int leftResult=leftTask.join();
int rightResult=rightTask.join(); //合并子任务
sum=leftResult+rightResult;
}
return sum;
} public static void main(String[] args) {
ForkJoinPool forkJoinPool=new ForkJoinPool();
//生成一个计算任务1+2+3+4
ForJoinTaskExample task=new ForJoinTaskExample( 1,100);
//执行一个任务
Future<Integer> result=forkJoinPool.submit(task);
try{
log.info("result:{}",((ForkJoinTask) result).get());
}catch (Exception e){
log.error("exception",e);
}
}
}

线程安全,用于生产消费者模式。




允许插入空对象

JUC-FutureTask的更多相关文章
- 基于接口回调详解JUC中Callable和FutureTask实现原理
Callable接口和FutureTask实现类,是JUC(Java Util Concurrent)包中很重要的两个技术实现,它们使获取多线程运行结果成为可能.它们底层的实现,就是基于接口回调技术. ...
- JUC源码分析-线程池篇(二)FutureTask
JUC源码分析-线程池篇(二)FutureTask JDK5 之后提供了 Callable 和 Future 接口,通过它们就可以在任务执行完毕之后得到任务的执行结果.本文从源代码角度分析下具体的实现 ...
- JUC源码学习笔记5——线程池,FutureTask,Executor框架源码解析
JUC源码学习笔记5--线程池,FutureTask,Executor框架源码解析 源码基于JDK8 参考了美团技术博客 https://tech.meituan.com/2020/04/02/jav ...
- 【JUC源码解析】FutureTask
简介 FutureTask, 一个支持取消行为的异步任务执行器. 概述 FutureTask实现了Future,提供了start, cancel, query等功能,并且实现了Runnable接口,可 ...
- JUC组件扩展(一):FutureTask理解
一.概述 FutureTask包装器是一种非常便利的机制,同时实现了Future和Runnable接口. 类图如下: FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable ...
- JUC 一 FutureTask
java.util.concurrent public class FutureTask<V> implements RunnableFuture<V> 简介 FutureTa ...
- 【JUC】JUC线程池框架综述
一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...
- java多线程系类:JUC线程池:03之线程池原理(二)(转)
概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
随机推荐
- xcode7: Undefined symbols for architecture i386: "_iconv_open", referenced from:
在整合cocos和quick时,出现这个错误,我按照以前的方法 link binary with libraries 中add libiconv.2.dylib ,发现已经没有了这个库. 网上找了一下 ...
- html内获取当前文件路径,页面获取当前路径
function getRealPath(){ var curWwwPath = window.document.location.href; var pathName = window.docume ...
- Python并发请求之requests_future模块使用
# -*- coding: utf-8 -*- # @Time : 2019-12-09 10:00 # @Author : cxa # @File : demo.py # @Software: Py ...
- Apache Kylin - 大数据下的OLAP解决方案
OLAPCube是一种典型的多维数据分析技术,Cube本身可以认为是不同维度数据组成的dataset,一个OLAP Cube 可以拥有多个维度(Dimension),以及多个事实(Factor Mea ...
- 在 Mac、Linux、Windows 下Go交叉编译
Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED= ...
- 【Beta】Scrum Meeting 8
前言 Beta阶段第8次会议在5月13日22:00由PM在大运村一公寓三层召开, 时长30min. 任务分配 姓名 今日任务 明日任务 困难 周博闻 修复修改密码问题#54 添加主页公告栏 #57实现 ...
- Element + Vue I18n动态import加载国际化语言包翻译文件
需求 项目为多页应用,包含产品a.b.c.d.e,每个产品都有自己的翻译文件.一次加载所有翻译文件是极度不合理的.于是考虑动态加载. 实现 参考官方文档:延迟加载翻译 项目结构 │ ├── dist ...
- adb server version (31) doesn't match this client (41); killing...
1.有时候用adb工具去连接安卓设备,或者模拟器的时候,会提示adb server version(31) doesn’t match this client(41)这样的提示.如图 提示的字面意思就 ...
- php curl 转为 x-www-form-urlencoded 方式
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); fr ...
- 关于最新版本的flutter在安卓打包的问题解决方法
1.集成友盟push提示androidx版本号不一致,需在gradle文件中手动选择即可,如下 buildscript { repositories { google() jcenter() mave ...