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之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
随机推荐
- GoCN每日新闻(2019-11-04)
GoCN每日新闻(2019-11-04) GoCN每日新闻(2019-11-04) 1. Go中垃圾收集器是如何标记内存的 https://medium.com/a-journey-with-go ...
- 某邀请赛misc key阉割发行版
目录 题目下载 提示 解题过程 1.提取RGB值 2.找到key 3.循环异或,得到flag 反思 题目下载 题目名:key 提示 提取钥匙中特殊颜色的RGB循环异或KEY值 解题过程 1.提取RGB ...
- Honk's pool[STL multiset]
目录 题目地址 题干 代码和解释 题目地址 Honk's pool(The Preliminary Contest for ICPC Asia Shenyang 2019 ) 题干 代码和解释 本题使 ...
- NULL与nullptr
[https://blog.csdn.net/weixin_40237626/article/details/82560012] 其实啊,在编译器进行解释程序时,NULL会被直接解释成0,所以这里的参 ...
- c# async,await, 委托函数
1.c#的异步实现,之前代码编写大都开几个线程. 现可以使用“async+await”方式实现异步(具体不详细介绍,暂且止在会用,仅仅是c#更新史上一个工具): static void Main(st ...
- SAS PROC SGPLOT
OPTIONS LS=MAX PS=MAX NOCENTER USER='.\00@Data'; PROC PRINT DATA=OpenDate;RUN; ODS LISTING GPATH='.\ ...
- DELPHI开始支持LINUX DOCKER
DELPHI开始支持LINUX DOCKER 本方翻译自Marco Cantu的文章. 在过去的几年中,将服务器端解决方案(实际上是任何类型的应用程序)部署到轻量级容器而不是物理机器或虚拟机已经变得越 ...
- ethtool 强制设置网卡运行模式为100M
ethtool -s eth0 autoneg off speed 100 duplex full
- mysql注入写文件
select * from admin where id =-1 union select 1,'<?php phpinfo();?>',3,4 into outfile 'c:\\1.p ...
- MAC OS系统替换homebrew使用阿里云或中科大的镜像源
阿里云镜像 # 替换brew.git: cd "$(brew --repo)" git remote set-url origin https://mirrors.aliyun.c ...