异步线程阻塞等待结果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 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构