响应式编程Reactor API大全(下)

这篇具有很好参考价值的文章主要介绍了响应式编程Reactor API大全(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Reactor 是一个基于响应式编程的库,主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API,包括创建、转换、过滤、组合等操作符,用于处理异步数据流。以下是一些 Reactor 的主要 API 示例:

pom依赖

   <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>io.projectreactor</groupId>
               <artifactId>reactor-bom</artifactId>
               <version>2023.0.0</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
   </dependencyManagement>


   <dependencies>
       <dependency>
           <groupId>io.projectreactor</groupId>
           <artifactId>reactor-core</artifactId>
       </dependency>
       <dependency>
           <groupId>io.projectreactor</groupId>
           <artifactId>reactor-test</artifactId>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.junit.jupiter</groupId>
           <artifactId>junit-jupiter</artifactId>
           <version>5.7.2</version>
           <scope>test</scope>
       </dependency>

   </dependencies>

61. 使用 Reactor 的 then 方法进行后续操作

then 方法用于在当前数据流完成后执行后续操作。

import reactor.core.publisher.Flux;

public class ReactorThenExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.just(1, 2, 3);

        // 在当前数据流完成后执行后续操作
        source.then(Mono.fromRunnable(() -> System.out.println("Done")))
                .subscribe();
    }
}

62. 使用 Reactor 的 publishOn 方法进行线程切换

publishOn 方法用于切换数据流的发布线程,从而改变元素处理的线程。

import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;

public class ReactorPublishOnExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.range(1, 3);

        // 将数据流的发布线程切换到另一个线程池
        source.publishOn(Schedulers.elastic())
                .map(value -> value * 2)
                .subscribe(System.out::println);
    }
}

63. 使用 Reactor 的 subscribeOn 方法进行订阅线程切换

subscribeOn 方法用于切换数据流的订阅线程,影响整个数据流的执行线程。

import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;

public class ReactorSubscribeOnExample {
    public static void main(String[] args) throws InterruptedException {
        Flux<Integer> source = Flux.range(1, 3).log();

        // 将数据流的订阅线程切换到另一个线程池 另一个线程:parallel-1
        source.subscribeOn(Schedulers.parallel())
                .map(value -> value * 2)
                .subscribe(System.out::println);

        Thread.sleep(23333);
    }
}

64. 使用 Reactor 的 delayElements 方法进行元素延迟

delayElements 方法用于延迟数据流中元素的发送。

import reactor.core.publisher.Flux;
import java.time.Duration;

public class ReactorDelayElementsExample {
    public static void main(String[] args) throws InterruptedException {
        Flux<Integer> source = Flux.range(1, 3);

        // 延迟每个元素的发送
        source.delayElements(Duration.ofSeconds(1))
                .subscribe(System.out::println);
        Thread.sleep(23333);
    }
}

65. 使用 Reactor 的 concatWith 方法进行数据流连接

concatWith 方法用于将两个数据流连接在一起,保持顺序

import reactor.core.publisher.Flux;

public class ReactorConcatWithExample {
    public static void main(String[] args) {
        Flux<Integer> source1 = Flux.just(1, 2, 3);
        Flux<Integer> source2 = Flux.just(4, 5, 6);

        // 将两个数据流连接在一起,保持顺序
        source1.concatWith(source2)
                .subscribe(System.out::println);
    }
}

66. 使用 Reactor 的 merge 方法进行多数据流合并

merge 方法用于将多个数据流合并成一个数据流,并发执行

import reactor.core.publisher.Flux;

public class ReactorMergeExample {
    public static void main(String[] args) {
        Flux<Integer> source1 = Flux.just(1, 2, 3);
        Flux<Integer> source2 = Flux.just(4, 5, 6);

        // 将两个数据流合并成一个数据流
        Flux<Integer> mergedFlux = Flux.merge(source1, source2);

        mergedFlux.subscribe(System.out::println);
    }
}

67. concatWith和merge的比较

  1. 执行顺序:
    • concatWith 这个方法会按照合并的顺序执行 Flux。它会等待第一个 Flux 完成(包括完成信号或错误信号),然后再开始下一个 Flux
    • merge 这个方法会并发执行所有的 Flux,它不会等待前一个 Flux 完成。因此,元素的顺序可能是交错的。
  2. 参数类型:
    • concatWith 它接受一个单独的 Flux 作为参数,将这个 Flux 追加到当前 Flux 的末尾。
    • merge 它接受可变参数,可以传入多个 Flux,并同时合并它们。
public class FluxConcatWithMergeExample {
    public static void main(String[] args) throws InterruptedException {
        Flux<Integer> flux1 = Flux.just(1, 2, 3).delayElements(Duration.ofMillis(100));
        Flux<Integer> flux2 = Flux.just(4, 5, 6).delayElements(Duration.ofMillis(50));
        Flux<Integer> flux3 = Flux.just(7, 8, 9).delayElements(Duration.ofMillis(75));

        // 使用 concatWith 方法,按顺序执行
        flux1.concatWith(flux2)
                .concatWith(flux3)
                .subscribe(v ->{
                    System.out.println("concatWith = " + v);
                });

        // 使用 merge 方法,并发执行
        Flux.merge(flux1, flux2, flux3)
                .subscribe(v ->{
                    System.out.println("merge = " + v);
                });

        Thread.sleep(22333);
    }
}

68. 使用 Reactor 的 mergeSequential 方法进行多数据流合并

mergeSequential 方法用于按顺序合并多个数据流,保持各个数据流的元素顺序。

import reactor.core.publisher.Flux;

public class ReactorMergeSequentialExample {
    public static void main(String[] args) {
        Flux<Integer> source1 = Flux.just(1, 2, 3);
        Flux<Integer> source2 = Flux.just(4, 5, 6);

        // 按顺序合并两个数据流
        Flux<Integer> mergedFlux = Flux.mergeSequential(source1, source2);

        mergedFlux.subscribe(System.out::println);
    }
}

69. 使用 Reactor 的 combineLatest 方法进行多数据流合并

combineLatest 方法用于合并多个数据流的最新元素。

import reactor.core.publisher.Flux;

public class ReactorCombineLatestExample {
    public static void main(String[] args) {
        Flux<Integer> source1 = Flux.just(1, 2, 3);
        Flux<Integer> source2 = Flux.just(4, 5, 6);

        // 合并两个数据流的最新元素
        Flux<Integer> combinedFlux = Flux.combineLatest(source1, source2, (a, b) -> a + b);

        combinedFlux.subscribe(System.out::println);
    }
}

71. 使用 Reactor 的 doOnNext 方法进行每个元素的附加操作

doOnNext 方法用于在每个元素发出时执行附加操作,例如日志记录、统计等。

import reactor.core.publisher.Flux;

public class ReactorDoOnNextExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.range(1, 3);

        // 在每个元素发出时执行附加操作
        source.doOnNext(value -> System.out.println("Processing: " + value))
                .subscribe(System.out::println);
    }
}

79. 使用 Reactor 的 fromCallable 方法创建带有返回值的 Mono

fromCallable 方法用于创建一个 Mono,其值由提供的 Callable 对象返回。

import reactor.core.publisher.Mono;

import java.util.concurrent.Callable;

public class ReactorFromCallableExample {
    public static void main(String[] args) {
        // 创建带有返回值的 Mono
        Mono<String> resultMono = Mono.fromCallable(() -> {
            // 执行一些计算
            return "Result";
        });

        resultMono.subscribe(System.out::println);
    }
}

80. 使用 Reactor 的 using 方法进行资源管理

using 方法用于在数据流的生命周期内管理资源,例如打开和关闭文件、网络连接等。

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class ReactorUsingExample {
    public static void main(String[] args) {
        // 使用 using 方法管理资源
        Flux<String> resultFlux = Flux.using(
                () -> getResource(), // 打开资源
                resource -> getData(resource), // 使用资源获取数据流
                resource -> releaseResource(resource) // 关闭资源
        );

        resultFlux.subscribe(System.out::println);
    }

    private static Mono<String> getResource() {
        System.out.println("Opening resource");
        return Mono.just("Resource");
    }

    private static Flux<String> getData(Mono resource) {
        System.out.println("Getting data from resource: " + resource);
        return Flux.just("Data1", "Data2", "Data3");
    }

    private static Mono<Void> releaseResource(Mono resource) {
        System.out.println("Releasing resource: " + resource);
        return Mono.empty();
    }
}

82. 使用 Reactor 的 scan 方法进行累积操作

scan 方法用于对数据流中的元素进行累积操作,并生成一个新的数据流。

import reactor.core.publisher.Flux;

public class ReactorScanExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.just(1, 2, 3, 4, 5);

        // 对数据流中的元素进行累积操作
        source.scan(0, (acc, value) -> acc + value)
                .subscribe(System.out::println);
    }
}

83. 使用 Reactor 的 takeWhile 方法进行条件性的元素获取

takeWhile 方法用于根据指定的条件获取数据流中的元素,直到条件不满足。

import reactor.core.publisher.Flux;

public class ReactorTakeWhileExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.just(1, 2, 3, 4, 5);

        // 根据条件获取元素,直到条件不满足
        source.takeWhile(value -> value < 4)
                .subscribe(System.out::println);
    }
}

84. 使用 Reactor 的 thenMany 方法进行串联操作

thenMany 方法用于在当前数据流完成后执行另一个数据流,将它们串联起来。

import reactor.core.publisher.Flux;

public class ReactorThenManyExample {
    public static void main(String[] args) {
        Flux<Integer> source1 = Flux.just(1, 2, 3);
        Flux<Integer> source2 = Flux.just(4, 5, 6);

        // 在当前数据流完成后执行另一个数据流
        source1.thenMany(source2)
                .subscribe(System.out::println);
    }
}

85. 使用 Reactor 的 ignoreElements 方法忽略所有元素

ignoreElements 方法用于忽略数据流中的所有元素,只关注完成信号或错误信号。

import reactor.core.publisher.Flux;

public class ReactorIgnoreElementsExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.just(1, 2, 3);

        // 忽略所有元素,只关注完成信号
        source.ignoreElements()
                .doOnTerminate(() -> System.out.println("Completed"))
                .subscribe();
    }
}

在 Reactor 中,Sink 是一个用于手动推送元素(signals)到 Subscriber 的接口。它允许你在创建 Flux 或 Mono 的过程中手动控制元素的生成。Reactor 提供了两种 SinkFluxSink 用于创建 Flux,MonoSink 用于创建 Mono。

98. 使用 FluxSink 发送元素和完成信号

import reactor.core.publisher.Flux;

public class FluxSinkExample {
    public static void main(String[] args) {
        Flux.create(fluxSink -> {
            for (int i = 0; i < 5; i++) {
                fluxSink.next(i); // 发送元素
            }
            fluxSink.complete(); // 发送完成信号
        })
        .subscribe(System.out::println);
    }
}

99. 使用 FluxSink 发送元素和错误信号

import reactor.core.publisher.Flux;

public class FluxSinkErrorExample {
    public static void main(String[] args) {
        Flux.create(fluxSink -> {
            for (int i = 0; i < 5; i++) {
                fluxSink.next(i); // 发送元素
            }
            fluxSink.error(new RuntimeException("Simulated error")); // 发送错误信号
        })
        .subscribe(
            System.out::println,
            error -> System.err.println("Error: " + error.getMessage())
        );
    }
}

100. 使用 MonoSink 发送元素和完成信号

import reactor.core.publisher.Mono;

public class MonoSinkExample {
    public static void main(String[] args) {
        Mono.create(monoSink -> {
            monoSink.success("Hello, Mono!"); // 发送元素
        })
        .subscribe(System.out::println);
    }
}

101. 使用 MonoSink 发送错误信号

import reactor.core.publisher.Mono;

public class MonoSinkErrorExample {
    public static void main(String[] args) {
        Mono.create(monoSink -> {
            monoSink.error(new RuntimeException("Simulated error")); // 发送错误信号
        })
        .subscribe(
            System.out::println,
            error -> System.err.println("Error: " + error.getMessage())
        );
    }
}

102. 使用 FluxSink 进行背压控制

在 Reactor 中,FluxSink 也提供了一些方法用于实现背压控制,以避免在高速生产者和低速消费者之间的元素溢出。

import reactor.core.publisher.Flux;
import reactor.core.publisher.FluxSink;

public class FluxSinkBackpressureExample {
    public static void main(String[] args) {
        Flux.create(fluxSink -> {
            for (int i = 0; i < 1000; i++) {
                fluxSink.next(i);
            }
        }, FluxSink.OverflowStrategy.BUFFER) // 指定背压策略
        .onBackpressureBuffer(10, buffer -> System.err.println("Buffer overflow! Discarding: " + buffer))
        .subscribe(value -> {
            // 模拟慢速消费者
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(value);
        });
    }
}

在上述例子中,通过指定 FluxSink.OverflowStrategy.BUFFER 背压策略,当消费者无法跟上生产者的速度时,缓冲区将被用来存储元素。使用 onBackpressureBuffer 方法可以在溢出时执行自定义的操作。

103. 使用 FluxSink 进行手动请求

FluxSink 也提供了 request 方法,允许消费者手动请求元素。

import reactor.core.publisher.Flux;
import reactor.core.publisher.FluxSink;

public class FluxSinkManualRequestExample {
    public static void main(String[] args) {
        Flux.create(fluxSink -> {
            for (int i = 0; i < 100; i++) {
                fluxSink.next(i);

                if (i % 10 == 0 && fluxSink.requestedFromDownstream() == 0) {
                    // 当请求的元素达到 0 时,等待下游再次请求
                    while (fluxSink.requestedFromDownstream() == 0) {
                        // 等待下游请求
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            fluxSink.complete();
        })
        .subscribe(System.out::println);
    }
}

在这个例子中,当消费者请求的元素达到 0 时,生产者会等待下游再次请求。这种手动控制请求的方式可以更灵活地处理背压。

107. 使用 Reactor 的 Hooks 进行全局错误处理

Hooks 是 Reactor 提供的一组钩子,可以用于全局错误处理,捕获整个流的错误。

import reactor.core.publisher.Flux;
import reactor.core.publisher.Hooks;

public class ReactorHooksErrorHandlingExample {
    public static void main(String[] args) {
        // 使用 Hooks 进行全局错误处理
        Hooks.onOperatorError((error, reference) -> {
            System.err.println("Global Error Handling: " + error.getMessage());
            return error;
        });

        Flux<Integer> source = Flux.just(1, 2, 0, 4, 5);

        // 流中的错误将被全局处理
        source.map(x -> 10 / x)
                .subscribe(
                        data -> System.out.println("Received: " + data),
                        error -> System.err.println("Subscriber Error: " + error.getMessage())
                );
    }
}

在这个例子中,我们使用 Hooks.onOperatorError 来设置全局错误处理,当流中发生错误时,会调用全局错误处理的回调方法。这可以用于捕获整个流的错误,而不是每个 subscribe 中单独处理。

109. 使用 Reactor 的 ConnectableFlux 进行热序列

ConnectableFlux 是 Reactor 提供的一种特殊类型的 Flux,它允许在订阅之前预热(开始生成元素),并在多个订阅者之间共享相同的序列。

import reactor.core.publisher.ConnectableFlux;
import reactor.core.publisher.Flux;

import java.time.Duration;

public class ReactorConnectableFluxExample {
    public static void main(String[] args) {
        ConnectableFlux<Integer> connectableFlux = Flux.range(1, 3)
                .delayElements(Duration.ofSeconds(1))
                .publish(); // 将普通的 Flux 转换为 ConnectableFlux

        connectableFlux.connect(); // 开始生成元素

        // 第一个订阅者
        connectableFlux.subscribe(data -> System.out.println("Subscriber 1: " + data));

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 第二个订阅者,共享相同的序列
        connectableFlux.subscribe(data -> System.out.println("Subscriber 2: " + data));

        // 结果:
        // Subscriber 1: 1
        // Subscriber 1: 2
        // Subscriber 2: 2
        // Subscriber 1: 3
        // Subscriber 2: 3
    }
}

在这个例子中,我们使用 publish 方法将普通的 Flux 转换为 ConnectableFlux,通过 connect 方法开始生成元素。第一个订阅者在元素生成过程中订阅,然后等待了 2 秒后,第二个订阅者也开始订阅,两者共享相同的序列。这种方式可以用于创建热序列,使得订阅者能够共享相同的元素序列。

110. 使用 Reactor 的 Flux.defer 实现延迟订阅

Flux.defer 允许你在每次订阅时创建一个新的 Flux,从而实现延迟订阅。这对于需要在每次订阅时执行一些逻辑的场景非常有用。

import reactor.core.publisher.Flux;

public class ReactorFluxDeferExample {
    public static void main(String[] args) {
        Flux<Integer> deferredFlux = Flux.defer(() -> {
            // 在每次订阅时创建新的 Flux
            System.out.println("Creating new Flux");
            return Flux.just(1, 2, 3);
        });

        // 第一个订阅
        deferredFlux.subscribe(data -> System.out.println("Subscriber 1: " + data));

        // 第二个订阅
        deferredFlux.subscribe(data -> System.out.println("Subscriber 2: " + data));

        // 结果:
        // Creating new Flux
        // Subscriber 1: 1
        // Subscriber 1: 2
        // Subscriber 1: 3
        // Creating new Flux
        // Subscriber 2: 1
        // Subscriber 2: 2
        // Subscriber 2: 3
    }
}

在这个例子中,Flux.defer 中的 lambda 表达式将在每次订阅时执行,因此每个订阅都会创建一个新的 Flux。这对于那些需要在每次订阅时重新生成数据的情况非常有用。

119. 使用 Reactor 的 Flux.handle 处理元素和错误

Flux.handle 方法用于处理元素和错误,通过提供一个 BiConsumer 处理每个元素,并通过提供一个 BiConsumer 处理错误。

import reactor.core.publisher.Flux;

public class ReactorFluxHandleExample {
    public static void main(String[] args) {
        Flux<Integer> source = Flux.just(1, 2, 0, 4, 5);

        // 处理元素和错误
        Flux<Integer> handledFlux = source.handle((value, sink) -> {
            if (value != 0) {
                sink.next(value); // 处理元素
            } else {
                sink.error(new RuntimeException("Cannot divide by zero")); // 处理错误
            }
        });

        handledFlux.subscribe(
            System.out::println,
            error -> System.err.println("Error: " + error.getMessage())
        );
    }
}

在这个例子中,我们使用 Flux.handle 处理每个元素,如果元素不为零,则将其发送到下游;如果元素为零,则通过 sink.error 处理错误。这可以用于处理元素和错误的场景。

120. 使用 Reactor 的 Mono.handle 处理元素和错误

Mono.handle 方法与 Flux.handle 类似,用于处理单个元素和错误。

import reactor.core.publisher.Mono;

public class ReactorMonoHandleExample {
    public static void main(String[] args) {
        Mono<Integer> source = Mono.just(10);

        // 处理元素和错误
        Mono<Integer> handledMono = source.handle((value, sink) -> {
            if (value > 0) {
                sink.next(value); // 处理元素
            } else {
                sink.error(new RuntimeException("Invalid value")); // 处理错误
            }
        });

        handledMono.subscribe(
            System.out::println,
            error -> System.err.println("Error: " + error.getMessage())
        );
    }
}

在这个例子中,我们使用 Mono.handle 处理单个元素,如果元素为正数,则发送到下游;如果元素不为正数,则通过 sink.error 处理错误。这可以用于处理单个元素和错误的场景。

太太太多了,到此为止吧~~~~

学习打卡day08:响应式编程Reactor API大全(下)文章来源地址https://www.toymoban.com/news/detail-792272.html

到了这里,关于响应式编程Reactor API大全(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

    我们将从以下3方面讨论Linux网络API: 1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。 2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发

    2024年02月07日
    浏览(55)
  • 【四万字】网络编程接口 Socket API 解读大全

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1 - 2001、POS

    2024年02月08日
    浏览(45)
  • 【Java学习笔记】 68 - 网络——TCP编程、UDP编程

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter21/src 目录 项目代码 网络 一、网络相关概念 1.网络通讯 2.网络 3.IP地址 4.域名 5.端口号 6.网络通讯协议 TCP协议:传输控制协议 UDP协议: 二、InetAddress类 1.相关方法 三、Socket 1.基本介绍 2.TCP网络通信编程 基本介绍 应用案例

    2024年02月04日
    浏览(53)
  • Java学习笔记37——网络编程01

    计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 网络编程 在网络通信协议下,实现网络互连的不同计算机上运行的

    2024年02月07日
    浏览(51)
  • Java 网络编程(大全)

    读者手册(必读)_云边的快乐猫的博客-CSDN博客 一、1网络通信的基本模式分为两种 1.CS模式 (Client---客户端,Server---服务端)  客户端是需要程序员去开发的,例如日常使用的各种的APP,服务端就是服务器。 例子:端游,依赖特定的PC端才能玩。 2.BS模式 (Browser---浏览器,

    2024年02月12日
    浏览(37)
  • 【Java转Go】快速上手学习笔记(六)之网络编程篇一

    go往期文章笔记: 【Java转Go】快速上手学习笔记(一)之环境安装篇 【Java转Go】快速上手学习笔记(二)之基础篇一 【Java转Go】快速上手学习笔记(三)之基础篇二 【Java转Go】快速上手学习笔记(四)之基础篇三 【Java转Go】快速上手学习笔记(五)之Gorm篇 这篇记的是网络

    2024年02月11日
    浏览(45)
  • 网络编程详解(select poll epoll reactor)

    serverfd = socket( opt ):调用socket( )方法创建一个对应的serverfd bind( serverfd, address ):调用bind( )方法将fd和指定的地址( ip + port )进行绑定 listen( serverfd ):调用listen( )方法监听前面绑定时指定的地址 clientfd = accept( serverfd ):进入无限循环等待接受客户端连接请求 n = read( clientfd, buf

    2024年04月09日
    浏览(37)
  • Java网络编程-API监测

    实现一个用于监测 API 接口可用性的线程类,其作用是通过发送 HTTP 请求到指定的 API 接口,并监测接口的可用性。 代码中的 APIThread 类继承自 Thread ,意味着它可以在单独的线程中执行。 在 run 方法中,使用 HttpURLConnection 建立与 API 接口的连接,并发送 HTTP 请求。通过设置连

    2024年02月08日
    浏览(38)
  • (Java高级教程)第三章Java网络编程-第七节2:Servlet API和综合案例

    前面说过,Servlet就是Tomcat这个HTTP服务器提供给Java的一组API,来完成构建动态页面等任务。Servlet中涉及的API非常多,这里我们只关注以下三个即可,其余的可在工作中获得遇到具体场景再学习使用 HttpServlet HttpServletRequest HttpServletResponse HttpServlet :它提供了处理基于HTTP协议的

    2024年02月09日
    浏览(48)
  • Java学习笔记21——常用API

    在 java.lang 下,使用不需要导包 被 final 修饰,是最终类,没有子类 执行基本数字运算的方法 没有构造方法,直接用类名访问(被static修饰 )。 Math的常用方法 在 java.lang 下,使用不需要导包 被 final 修饰,是最终类,没有子类 System类包含几个有用的类字段和方法。它不能被

    2024年02月07日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包