广告
返回顶部
首页 > 资讯 > 精选 >Java中异步转同步的方法有哪些
  • 305
分享到

Java中异步转同步的方法有哪些

2023-07-02 09:07:16 305人浏览 安东尼
摘要

今天小编给大家分享一下Java中异步转同步的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、问题应用场景应用中通

今天小编给大家分享一下Java中异步转同步的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、问题

应用场景

应用中通过框架发送异步命令时,不能立刻返回命令的执行结果,而是异步返回命令的执行结果。

那么,问题来了,针对应用中这种异步调用,能不能像同步调用一样立刻获取到命令的执行结果,如何实现异步转同步?

二、分析

首先,解释下同步和异步

  • 同步,就是发出一个调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。

  • 异步,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。

对于异步调用,调用的返回并不受调用者控制。

异步转同步主要实现思路:所有实现原理类似,是在发出调用的线程中进行阻塞等待结果,调用完成后通过回调、设置共享状态或通知进行阻塞状态的解除,继续执行后续操作。

三、实现方法

通常,实现中,不会无限的等待,一般会设定一个超时时间,具体超时时间根据具体场景确定。

下面以回调的方式介绍几种常用实现异步转同步的方法:

1.轮询与休眠重试机制

采用轮询与休眠重试机制,线程将反复在休眠和测试状态条件中之间切换,直到超时或者状态条件满足继续向下执行。这种方式,超时时间控制不准确,sleep时间需要在响应性和CPU使用率之间进行权衡。

private static long MILLIS_OF_WaiT_TIME = 300000L;// 等待时间 5分钟private final Object lock = new Object();//3.结果返回后进行回调,解除阻塞@Overridepublic void callback(AsynResponse response){    synchronized(lock){        //设置状态条件} public Result getResult() throws ErrorCodeException {// 1.异步调用 // 2.阻塞等待异步响应    long future = System.currentTimeMillis() + MILLIS_OF_WAIT_TIME;    long remaining = MILLIS_OF_WAIT_TIME;//剩余等待时间    while(remaining > 0){        synchronized(lock){            if(状态条件未满足){                remaining = future - System.currentTimeMillis();                Thread.sleep(时间具体场景确定);            }        }  ````} //4.超时或结果正确返回,对结果进行处理         return result;}

2.wait/notify

任意一个Java对象,都拥有一组监视器方法(wait、notify、notifyAll等方法),这些方法和synchronized同步关键字配合,可以实现等待/通知模式。但是使用wait/notify,使线程的阻塞/唤醒对线程本身来说是被动的,要准确的控制哪个线程是很困难的,所以是要么随机唤醒等待在条件队列上一个线程(notify),要么唤醒所有的(notifyAll,但是很低效)。当多个线程基于不同条件在同一条件队列上等待时,如果使用notify而不是notifyAll,很容易导致信号丢失的问题,所以必须谨慎使用wait/notify方法。

private static long MILLIS_OF_WAIT_TIME = 300000L;// 等待时间 5分钟private final Object lock = new Object();//3.结果返回后进行回调,解除阻塞@Overridepublic void callback(AsynResponse response){    synchronized(lock){        lock.notifyAll();} public Result getResult() throws ErrorCodeException {// 1.异步调用 // 2.阻塞等待异步响应    long future = System.currentTimeMillis() + MILLIS_OF_WAIT_TIME;    long remaining = MILLIS_OF_WAIT_TIME;//剩余等待时间    synchronized(lock){        while(条件未满足  && remaining > 0){ //被通知后要检查条件            lock.wait(remaining);            remaining = future - System.currentTimeMillis();        }  ````}    //4.超时或结果正确返回,对结果进行处理    return result;}

3.Lock Condition

使用Lock的Condition队列的实现方式和wait/notify方式类似,但是Lock支持多个Condition队列,并且支持等待状态中响应中断。

private static long SECONDS_OF_WAIT_TIME = 300L;// 等待时间 5分钟private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();//3.结果返回后进行回调,解除阻塞@Overridepublic void callback(AsynResponse response){    lock.lock();//这是前提    try {        condition.signal();    }finally {        lock.unlock();    }}public Result getResult() throws ErrorCodeException {// 1.异步调用// 2.阻塞等待异步响应    lock.lock();//这是前提    try {        condition.await();    } catch (InterruptedException e) {        //TODO    }finally {        lock.unlock();    }//4.超时或结果正确返回,对结果进行处理    return result;}

4.CountDownLatch

使用CountDownLatch可以实现异步转同步,它好比计数器,在创建实例CountDownLatch对象的时候传入数字,每使用一次 countDown() 方法计数减1,当数字减到0时, await()方法后的代码将可以执行,未到0之前将一直阻塞等待。

private static long SECONDS_OF_WAIT_TIME = 300L;// 等待时间 5分钟private final CountDownLatch countDownLatch = new CountDownLatch(1);//3.结果返回后进行回调,解除阻塞@Overridepublic void callback(AsynResponse response){    countDownLatch.countDown();}public Result getResult() throws ErrorCodeException {    // 1.异步调用    // 2.阻塞等待异步响应    try {        countDownLatch.await(SECONDS_OF_WAIT_TIME, TimeUnit.SECONDS);    } catch (InterruptedException e) {        //TODO    }//4.超时或结果正确返回,对结果进行处理    return result;}

5.CyclicBarrier

让一组线程达到一个屏障(也可以叫同步点)时被阻塞,直到等待最后一个线程到达屏障时,屏障才开门,所有被屏障拦截的线程才会继续执行。

每个线程通过调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前的的线程被阻塞。

private static long SECONDS_OF_WAIT_TIME = 300L;// 等待时间 5分钟private final CountDownLatch cyclicBarrier= new CyclicBarrier(2);//设置屏障拦截的线程数为2//3.结果返回后进行回调,解除阻塞@Overridepublic void callback(AsynResponse response){    //我也到达屏障了,可以开门了    cyclicBarrier.await();}public Result getResult() throws ErrorCodeException {    // 1.异步调用    // 2.阻塞等待异步响应    try {        //我到达屏障了,还没开门,要等一等        cyclicBarrier.await(SECONDS_OF_WAIT_TIME, TimeUnit.SECONDS);    } catch (InterruptedException e) {        //TODO    }//4.超时或结果正确返回,对结果进行处理    return result;}

CountDownLatch和CyclicBarrier实现类似,区别是CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset重置,

所以CyclicBarrier能处理更为复杂的业务场景。在异步转同步中,计数器不会重用,所以使用CountDownLatch实现更适合。

6.LockSupport

LockSupport定义了一组公共静态方法,提供了最基本的线程阻塞和唤醒的方法。

private static long NANOS_OF_WAIT_TIME = 300000000L;// 等待时间 5分钟private final LockSupport lockSupport = new LockSupport();//3.结果返回后进行回调,解除阻塞@Overridepublic void callback(AsynResponse response){    lockSupport.unpark();}public Result getResult() throws ErrorCodeException {    // 1.异步调用    // 2.阻塞等待异步响应    try {        lockSupport.parkNanos(NANOS_OF_WAIT_TIME);    } catch (InterruptedException e) {        //TODO    }//4.超时或结果正确返回,对结果进行处理    return result;}

以上就是“Java中异步转同步的方法有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java中异步转同步的方法有哪些

本文链接: https://www.lsjlt.com/news/340892.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中异步转同步的方法有哪些
    今天小编给大家分享一下Java中异步转同步的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、问题应用场景应用中通...
    99+
    2023-07-02
  • java异步转同步的方法是什么
    Java中实现异步转同步的方法有多种,下面列举了几种常用的方法。 使用CountDownLatch: CountDownLatch...
    99+
    2023-10-24
    java
  • java同步方法有哪些
    在Java中,有几种实现同步的方式: 使用synchronized关键字:通过在方法前面加上synchronized关键字来实现...
    99+
    2023-10-25
    java
  • 详解Java中异步转同步的六种方法
    目录一、问题应用场景二、分析三、实现方法1.轮询与休眠重试机制2.wait/notify3.Lock Condition4.CountDownLatch5.CyclicBarrier...
    99+
    2022-11-13
  • java同步和异步的区别有哪些
    Java中同步(Synchronous)和异步(Asynchronous)的区别主要体现在程序的执行方式和处理结果上。1. 执行方式...
    99+
    2023-08-09
    java
  • java中有哪些线程同步的方法
    java中有哪些线程同步的方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.同步方法     即有synchroni...
    99+
    2023-05-30
    java 多线程
  • java实现异步的方法有哪些
    Java实现异步的方法有以下几种:1. 使用线程池:可以通过ExecutorService接口创建线程池,然后使用submit()或...
    99+
    2023-08-09
    java
  • IDE 中的 Java 和 JavaScript 同步方法有哪些?
    当开发者在使用集成开发环境(IDE)进行 Java 或 JavaScript 开发时,同步方法是不可或缺的一部分。同步方法是一种确保多个线程在访问共享资源时不会产生竞争条件的技术。在本文中,我们将讨论 IDE 中的 Java 和 JavaS...
    99+
    2023-07-03
    javascript ide 同步
  • redis同步方法有哪些
    Redis的同步方法有以下几种:1. RDB持久化:将内存中的数据转存到硬盘上的RDB文件中,通过设置Redis的持久化策略可以定期...
    99+
    2023-08-24
    redis
  • java中实现多线程同步的方法有哪些
    这篇文章将为大家详细讲解有关java中实现多线程同步的方法有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要线程同步因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既...
    99+
    2023-05-31
    java 多线程同步 ava
  • java异步调用的实现方法有哪些
    在Java中,有以下几种方式可以实现异步调用:1. 使用Thread类:可以通过创建和启动一个新的线程来实现异步调用。这种方式比较底...
    99+
    2023-08-12
    java
  • ajax同步和异步的区别有哪些
    这篇文章主要讲解了“ajax同步和异步的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ajax同步和异步的区别有哪些”吧! ...
    99+
    2022-10-19
  • node同步与异步的区别有哪些
    这篇“node同步与异步的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node...
    99+
    2022-10-19
  • Java实现多线程同步的方法有哪些
    Java实现多线程同步的方法有以下几种:1. 使用synchronized关键字:通过在方法或代码块前加上synchronized关...
    99+
    2023-08-14
    Java
  • kafka同步发送和异步发送有哪些异同点
    Kafka的同步发送和异步发送方式有以下异同点: 异同点: 发送方式:同步发送和异步发送都是通过KafkaProducer发送消息...
    99+
    2023-10-27
    kafka
  • 详解Java中CountDownLatch异步转同步工具类
    使用场景 由于公司业务需求,需要对接socket、MQTT等消息队列。 众所周知 socket 是双向通信,socket的回复是人为定义的,客户端推送消息给服务端,服务端的回复是两条...
    99+
    2022-11-12
  • java异步编程有哪些方式
    本篇内容介绍了“java异步编程有哪些方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要异步?操作系统可以看作是个虚拟机(VM),...
    99+
    2023-06-15
  • java多线程之线程同步的方法有哪些
    Java中线程同步的方法有以下几种:1. synchronized关键字:使用synchronized关键字可以实现对代码块、方法或...
    99+
    2023-09-27
    java
  • Java 和 JavaScript 的 IDE 同步方式有哪些?
    Java 和 JavaScript 是目前最受欢迎的编程语言之一。它们都有很多优秀的 IDE 工具,使得开发者能够更加高效地编写代码,提高开发效率。但是,对于那些同时使用 Java 和 JavaScript 的开发者来说,如何在 IDE 中...
    99+
    2023-07-03
    javascript ide 同步
  • SpringBoot异步处理的方法有哪些
    小编给大家分享一下SpringBoot异步处理的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步请求与同步请求我们先通过一张图来区分一下异步请求和同步...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作