最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java響應(yīng)式編程之handle用法解析

 更新時(shí)間:2022年10月26日 15:45:28   作者:韓金龍小傻瓜  
這篇文章主要介紹了Java響應(yīng)式編程之handle用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java handle用法

JAVA響應(yīng)式編程reactor中如果需要對(duì)一個(gè)flux中的數(shù)據(jù)進(jìn)行提前返回 可以使用handle

具體如下:

@GetMapping("/a")
    public Mono<Object> a() throws InterruptedException {
        long begin = System.currentTimeMillis();
        Mono<String> m5 = Mono.just("").map(s -> {
            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println("5");
                System.out.println(System.currentTimeMillis() - begin);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "5";
        }).subscribeOn(Schedulers.boundedElastic());

        Mono<String> m8 = Mono.just("").map(s -> {
            try {
                TimeUnit.SECONDS.sleep(8);
                System.out.println("8");
                System.out.println(System.currentTimeMillis() - begin);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "8";
        }).subscribeOn(Schedulers.boundedElastic());
        Mono<String> m10 = Mono.just("").map(s -> {
            try {
                TimeUnit.SECONDS.sleep(15);
                System.out.println("15");
                System.out.println(System.currentTimeMillis() - begin);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "15";
        }).subscribeOn(Schedulers.boundedElastic());
        
        Mono<Object> single = Flux.merge(m8, m5, m10).handle(((s, synchronousSink) -> {
            if ("8".equals(s)) {
                synchronousSink.next("盧本偉牛");
                synchronousSink.complete();
            }
        })).defaultIfEmpty("null").single();
        return single;
    }

subscribeOn(Schedulers.boundedElastic())是讓這些mono進(jìn)行異步處理

上述定義了3個(gè)Mono進(jìn)行請(qǐng)求 使用Sleep進(jìn)行模擬請(qǐng)求中業(yè)務(wù)處理耗時(shí)

m5是需要執(zhí)行3s m8是需要執(zhí)行8s m10是需要執(zhí)行15s

如果我們有多個(gè)耗時(shí)處理的請(qǐng)求 需要同時(shí)請(qǐng)求 然后又需要合并結(jié)果 并且返回我們需要的結(jié)果 進(jìn)行提前返回。

例如:我需要同時(shí)請(qǐng)求這些接口 當(dāng)8這個(gè)接口有結(jié)果返回的時(shí)候 由于其他請(qǐng)求時(shí)間太長(zhǎng)了 需要提前返回一個(gè)值 放棄其他結(jié)果處理 所以我們可以進(jìn)行判斷.

//這個(gè)s代表前面?zhèn)魅氲脑?執(zhí)行完會(huì)傳入這個(gè)handle  
// synchronousSink.next() 代表我執(zhí)行完這個(gè)流返回給下一個(gè)進(jìn)行處理  next(Object)  
// synchronousSink.complete(); 代表我們執(zhí)行完取消其他的流
Flux.merge(m8, m5, m10).handle(((s, synchronousSink) -> {

            if ("8".equals(s)) {
                synchronousSink.next("盧本偉牛");
                synchronousSink.complete();
            }
        })).subscribe(s -> {
                    System.err.println(s);
                });

由于上面當(dāng)s為8的時(shí)候 將盧本偉牛傳入下一個(gè)流 然后執(zhí)行完成 所以還有個(gè)m10不會(huì)執(zhí)行完 就會(huì)直接丟棄

我們進(jìn)行測(cè)試

發(fā)現(xiàn)控制臺(tái)打印

我們?nèi)绻褂脗鹘y(tǒng)的mvc執(zhí)行m5我們會(huì)耗時(shí)5s m8會(huì)耗時(shí)8s 加起來就是13s

我們使用響應(yīng)式編程則只會(huì)耗時(shí)8s 當(dāng)如果多個(gè)耗時(shí)操作拼接在一起 我們需要多個(gè)返回結(jié)果的時(shí)候我們可以使用handle進(jìn)行提前返回

返回結(jié)果為盧本偉牛 也就是我們之前當(dāng)s為8時(shí)執(zhí)行的 ,synchronousSink.next(“盧本偉牛”);,將這個(gè)字符串傳給最終結(jié)果的流,當(dāng)然我們也可以根據(jù)自己的邏輯 發(fā)放多個(gè)synchronousSink.next。

handle的標(biāo)準(zhǔn)使用方式

在Java語言中,直接將handle聲明為Activity的內(nèi)部類去使用handle,非靜態(tài)內(nèi)部類會(huì)持有外部類的一個(gè)隱試引用,這樣就可能造成外部類無法被垃圾回收,從而導(dǎo)致內(nèi)存泄漏。

故而,給出規(guī)范的handle使用方式如下:

handle的基類

public class UIHandler<T> extends Handler{
?
? ? ?protected WeakReference<T> ref;
?
? ? ?public UIHandler(T cla){
? ? ? ? ref = new WeakReference<T>(cla);
? ? ?}
?
? ? ? public T getRef(){
? ? ? ? ? return ref != null ? ref.get() : null;
? ? ? }
}

handle運(yùn)用實(shí)例

public class MainActivity extends Activity{
?
? ? private final MainHandler mHandler = new MainHandler(this);
?
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState){
? ? ? ? super.oncreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? mHandler.post(mRunnable);
? ? }
?
? ? private static final Runnable mRunnable = new Runnable(){
?
? ? ? ? @Override
? ? ? ? ?public void run(){
?
? ? ? ? ?}
? ? };
?
? ? private class MainHandler extends UIHandler{
? ? ? ? ?private MainHandler(MainActivity activity){
? ? ? ? ? ? ?super(activity);
? ? ? ? ?}
? ? ? ? ?
? ? ? ? ?@Override
? ? ? ? ?public void handleMessage(Message msg){
? ? ? ? ? ? ?super.handleMessage(msg);
? ? ? ? ? ? ?MainActivity activity = (MainActivity)ref.get();
? ? ? ? ? ? ?if(activity != null){
? ? ? ? ? ? ? ? if (activity.isFinishing()
? ? ? ? ? ? ? ? ? ? return;
          switch(msg.what){
            case 1:
            break;
          }
? ? ? ? ? ? ?}
? ? ? ? ?}
? ? }
} ? ?

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot Shiro權(quán)限管理方式

    SpringBoot Shiro權(quán)限管理方式

    這篇文章主要介紹了SpringBoot Shiro權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot數(shù)據(jù)訪問自定義使用Druid數(shù)據(jù)源的方法

    SpringBoot數(shù)據(jù)訪問自定義使用Druid數(shù)據(jù)源的方法

    本文記錄Druid數(shù)據(jù)源的使用,自定義實(shí)現(xiàn)Drud的功能、監(jiān)控頁、登錄、統(tǒng)計(jì)等。對(duì)SpringBoot數(shù)據(jù)訪問使用Druid數(shù)據(jù)源的相關(guān)知識(shí)感興趣額朋友一起看看吧
    2021-08-08
  • Java 中文字符按Unicode排序的實(shí)現(xiàn)方法

    Java 中文字符按Unicode排序的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java 中文字符按Unicode排序的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Java e.printStackTrace()案例講解

    Java e.printStackTrace()案例講解

    這篇文章主要介紹了Java e.printStackTrace()案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Mybatis-Plus 全局配置無效的解決方案

    Mybatis-Plus 全局配置無效的解決方案

    這篇文章主要介紹了Mybatis-Plus 全局配置無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java.mail實(shí)現(xiàn)發(fā)送郵件

    java.mail實(shí)現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了java.mail實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Java內(nèi)部類及其特點(diǎn)的講解

    Java內(nèi)部類及其特點(diǎn)的講解

    今天小編就為大家分享一篇關(guān)于Java內(nèi)部類及其特點(diǎn)的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 23種設(shè)計(jì)模式(7) java代理模式

    23種設(shè)計(jì)模式(7) java代理模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java代理模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java超細(xì)致講解數(shù)組的使用

    Java超細(xì)致講解數(shù)組的使用

    數(shù)組對(duì)于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲(chǔ)固定大小的同類型元素
    2022-05-05
  • Sping中如何處理@Bean注解bean同名的問題

    Sping中如何處理@Bean注解bean同名的問題

    這篇文章主要介紹了Sping中如何處理@Bean注解bean同名的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

开平市| 增城市| 阳曲县| 东乌珠穆沁旗| 漠河县| 玉龙| 永修县| 竹溪县| 云安县| 榆中县| 玉田县| 教育| 全州县| 清涧县| 印江| 金平| 道真| 弥勒县| 江口县| 罗田县| 平江县| 长沙市| 凤台县| 商都县| 浪卡子县| 江口县| 滨州市| 扶余县| 紫云| 灵宝市| 临猗县| 和顺县| 临高县| 齐河县| 新营市| 双柏县| 长丰县| 清河县| 武汉市| 玉门市| 郸城县|