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

Java響應式編程之handle用法解析

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

Java handle用法

JAVA響應式編程reactor中如果需要對一個flux中的數(shù)據(jù)進行提前返回 可以使用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進行異步處理

上述定義了3個Mono進行請求 使用Sleep進行模擬請求中業(yè)務處理耗時

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

如果我們有多個耗時處理的請求 需要同時請求 然后又需要合并結果 并且返回我們需要的結果 進行提前返回。

例如:我需要同時請求這些接口 當8這個接口有結果返回的時候 由于其他請求時間太長了 需要提前返回一個值 放棄其他結果處理 所以我們可以進行判斷.

//這個s代表前面?zhèn)魅氲脑?執(zhí)行完會傳入這個handle  
// synchronousSink.next() 代表我執(zhí)行完這個流返回給下一個進行處理  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);
                });

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

我們進行測試

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

我們如果使用傳統(tǒng)的mvc執(zhí)行m5我們會耗時5s m8會耗時8s 加起來就是13s

我們使用響應式編程則只會耗時8s 當如果多個耗時操作拼接在一起 我們需要多個返回結果的時候我們可以使用handle進行提前返回

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

handle的標準使用方式

在Java語言中,直接將handle聲明為Activity的內部類去使用handle,非靜態(tà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運用實例

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;
          }
? ? ? ? ? ? ?}
? ? ? ? ?}
? ? }
} ? ?

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

相關文章

  • SpringBoot Shiro權限管理方式

    SpringBoot Shiro權限管理方式

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

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

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

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

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

    Java e.printStackTrace()案例講解

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

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

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

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

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

    Java內部類及其特點的講解

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

    23種設計模式(7) java代理模式

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

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

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

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

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

最新評論

克山县| 克拉玛依市| 探索| 龙州县| 五常市| 内丘县| 安西县| 普兰店市| 湖南省| 宁蒗| 新宾| 清水河县| 通榆县| 阿克苏市| 东丰县| 洪泽县| 长岭县| 凤庆县| 南木林县| 宁陕县| 崇阳县| 灌云县| 德阳市| 甘谷县| 博罗县| 德兴市| 邻水| 外汇| 达州市| 德令哈市| 蕲春县| 句容市| 布尔津县| 绥滨县| 桃园县| 监利县| 清新县| 平山县| 深州市| 庆云县| 阳城县|