异步线程阻塞等待结果Futrue

2024-01-29 22:38

本文主要是介绍异步线程阻塞等待结果Futrue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package com.bjsxt.height.design014;public class Main {public static void main(String[] args) throws InterruptedException {FutureClient fc = new FutureClient();Data data = fc.request("请求参数");System.out.println(Thread.currentThread()+"请求发送成功!");System.out.println(Thread.currentThread()+"做其他的事情...");String result = data.getRequest();//此时阻塞System.out.println(Thread.currentThread()+result);}
}
package com.bjsxt.height.design014;public class FutureClient {public Data request(final String queryStr){//同步了一个结果   一步了一个结果//1 我想要一个代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到,可以做其他的事情final FutureData futureData = new FutureData();//2 启动一个新的线程,去加载真实的数据,传递给这个代理对象new Thread(new Runnable() {@Overridepublic void run() {//3 这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象System.out.println(Thread.currentThread()+"real 开启子线程开始耗时");RealData realData = new RealData(queryStr);futureData.setRealData(realData);//通知已经不要阻塞}}).start();System.out.println(Thread.currentThread()+"直接返回了futureData");return futureData;}}
package com.bjsxt.height.design014;public interface Data {String getRequest();}
package com.bjsxt.height.design014;public class FutureData implements Data{private RealData realData ;private boolean isReady = false;public synchronized void setRealData(RealData realData) {//如果已经装载完毕了,就直接返回if(isReady){return;}//如果没装载,进行装载真实对象this.realData = realData;isReady = true;//进行通知notify();}@Overridepublic synchronized String getRequest() {//如果没装载好 程序就一直处于阻塞状态while(!isReady){try {System.out.println(Thread.currentThread()+"开始阻塞");wait();} catch (InterruptedException e) {e.printStackTrace();}}//装载好直接获取数据即可return this.realData.getRequest();}}
package com.bjsxt.height.design014;public class RealData implements Data{private String result ;public RealData (String queryStr){System.out.println(Thread.currentThread()+"根据" + queryStr + "进行查询,这是一个很耗时的操作..");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread()+"操作完毕,获取结果");result = "查询结果";}@Overridepublic String getRequest() {return result;}}

Thread[main,5,main]直接返回了futureData
Thread[Thread-0,5,main]real 开启子线程开始耗时
Thread[main,5,main]请求发送成功!
Thread[main,5,main]做其他的事情...
Thread[main,5,main]开始阻塞
Thread[Thread-0,5,main]根据请求参数进行查询,这是一个很耗时的操作..
Thread[Thread-0,5,main]操作完毕,获取结果
Thread[main,5,main]查询结果
 

这篇关于异步线程阻塞等待结果Futrue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658393

相关文章

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异