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

Spring Boot 4.0 虛擬線程啟用配置與性能測(cè)試全解析

 更新時(shí)間:2026年03月13日 11:16:52   作者:碼刀攻城  
本文將從核心概念入手,詳細(xì)講解Spring Boot 4.0啟用虛擬線程的多種配置方式、提供完整的示例代碼,再通過(guò)嚴(yán)謹(jǐn)?shù)男阅軠y(cè)試驗(yàn)證其效果,并進(jìn)行相關(guān)內(nèi)容拓展,幫助大家全面掌握這一實(shí)用技術(shù),感興趣的朋友跟隨小編一起看看吧

在Java 21中,虛擬線程(Virtual Threads)正式從預(yù)覽特性轉(zhuǎn)正,它作為輕量級(jí)線程,徹底改變了Java程序的并發(fā)編程模式。Spring Boot 4.0基于Java 21+構(gòu)建,深度集成了虛擬線程特性,無(wú)需復(fù)雜的底層封裝,即可讓開(kāi)發(fā)者輕松享受虛擬線程帶來(lái)的高并發(fā)優(yōu)勢(shì)。本文將從核心概念入手,詳細(xì)講解Spring Boot 4.0啟用虛擬線程的多種配置方式、提供完整的示例代碼,再通過(guò)嚴(yán)謹(jǐn)?shù)男阅軠y(cè)試驗(yàn)證其效果,并進(jìn)行相關(guān)內(nèi)容拓展,幫助大家全面掌握這一實(shí)用技術(shù)。

一、核心概念:虛擬線程是什么?

在講解配置之前,我們先簡(jiǎn)單厘清虛擬線程的核心特性,避免后續(xù)配置和測(cè)試時(shí)產(chǎn)生理解偏差。

傳統(tǒng)的Java線程(也稱(chēng)為平臺(tái)線程)是直接映射到操作系統(tǒng)內(nèi)核線程的,其創(chuàng)建和銷(xiāo)毀會(huì)占用大量系統(tǒng)資源,且上下文切換開(kāi)銷(xiāo)較高。當(dāng)并發(fā)量達(dá)到萬(wàn)級(jí)以上時(shí),平臺(tái)線程容易出現(xiàn)資源耗盡、響應(yīng)變慢的問(wèn)題。

虛擬線程則是由JVM管理的“用戶(hù)態(tài)線程”,它不直接映射到內(nèi)核線程,而是通過(guò)“載體線程”(通常是平臺(tái)線程)來(lái)執(zhí)行。一個(gè)載體線程可以承載數(shù)千個(gè)虛擬線程,當(dāng)虛擬線程遇到IO阻塞(如數(shù)據(jù)庫(kù)查詢(xún)、網(wǎng)絡(luò)請(qǐng)求、文件讀寫(xiě))時(shí),JVM會(huì)將其掛起,并將載體線程釋放給其他虛擬線程使用,待IO操作完成后再恢復(fù)虛擬線程執(zhí)行。這種特性使得虛擬線程在高并發(fā)IO場(chǎng)景下,能極大提升系統(tǒng)的吞吐量,且資源占用遠(yuǎn)低于平臺(tái)線程。

關(guān)鍵結(jié)論:虛擬線程并非“銀彈”,它更適合IO密集型場(chǎng)景(如Web服務(wù)、接口調(diào)用、數(shù)據(jù)查詢(xún));對(duì)于CPU密集型場(chǎng)景(如大規(guī)模計(jì)算、循環(huán)處理),由于虛擬線程掛起的機(jī)會(huì)極少,性能提升有限,甚至可能不如平臺(tái)線程。

二、Spring Boot 4.0 啟用虛擬線程的3種核心配置方式

Spring Boot 4.0對(duì)虛擬線程的支持做了高度封裝,提供了全局啟用、局部Bean啟用、異步任務(wù)啟用3種常用方式,滿(mǎn)足不同場(chǎng)景的需求。以下示例均基于Spring Boot 4.0.0 + Java 21構(gòu)建,需先確保環(huán)境配置正確。

2.1 環(huán)境準(zhǔn)備:基礎(chǔ)依賴(lài)配置

首先創(chuàng)建Spring Boot 4.0項(xiàng)目,核心依賴(lài)如下(Maven):

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.0</version>
    <relativePath/>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

注意:Spring Boot 4.0要求JDK版本必須≥21,需在IDE中配置好JDK 21及以上環(huán)境。

2.2 方式1:全局啟用虛擬線程(最推薦,Web場(chǎng)景)

Spring Boot 4.0提供了全局配置項(xiàng),只需在application.yml(或application.properties)中添加一行配置,即可為整個(gè)Web應(yīng)用啟用虛擬線程(包括Tomcat線程池、Spring MVC請(qǐng)求處理線程等)。

2.2.1 配置文件

# application.yml
spring:
  # 全局啟用虛擬線程
  threads:
    virtual:
      enabled: true
server:
  port: 8080
  # 可選:Tomcat相關(guān)配置(虛擬線程模式下無(wú)需手動(dòng)配置線程池大小,JVM自動(dòng)管理)
  tomcat:
    threads:
      max: 200 # 載體線程最大數(shù)量(默認(rèn)值即可,無(wú)需過(guò)度調(diào)整)
    connection-timeout: 20000
    max-connections: 10000 # 最大連接數(shù),配合虛擬線程提升并發(fā)

2.2.2 驗(yàn)證代碼

創(chuàng)建一個(gè)測(cè)試接口,通過(guò)打印當(dāng)前線程信息,驗(yàn)證是否啟用了虛擬線程:

package com.example.virtualthread.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
@Slf4j
public class VirtualThreadTestController {
    /**
     * 測(cè)試全局虛擬線程啟用效果
     */
    @GetMapping("/global-virtual")
    public String testGlobalVirtualThread() {
        // 獲取當(dāng)前線程
        Thread currentThread = Thread.currentThread();
        // 打印線程信息:線程名、是否為虛擬線程、線程ID
        log.info("當(dāng)前線程信息:name={}, isVirtual={}, id={}",
                currentThread.getName(),
                currentThread.isVirtual(),
                currentThread.getId());
        return "全局虛擬線程測(cè)試成功!線程信息已打印到日志";
    }
}

2.2.3 運(yùn)行驗(yàn)證

啟動(dòng)Spring Boot應(yīng)用,訪問(wèn)http://localhost:8080/test/global-virtual,查看控制臺(tái)日志:

2025-12-10 10:00:00.000  INFO 12345 --- [  virtual-123] c.e.v.controller.VirtualThreadTestController  : 當(dāng)前線程信息:name=virtual-123, isVirtual=true, id=123

若日志中isVirtual=true,且線程名以virtual-開(kāi)頭,說(shuō)明全局虛擬線程已成功啟用。

2.3 方式2:局部Bean啟用虛擬線程(指定組件使用)

若不想全局啟用虛擬線程,僅希望某個(gè)特定的Bean(如Service、Controller)使用虛擬線程,可以通過(guò)配置ThreadFactory來(lái)實(shí)現(xiàn)。Spring Boot 4.0提供了VirtualThreadTaskExecutor,可直接注入使用。

2.3.1 配置類(lèi):創(chuàng)建虛擬線程執(zhí)行器

package com.example.virtualthread.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.VirtualThreadTaskExecutor;
@Configuration
public class VirtualThreadConfig {
    /**
     * 創(chuàng)建虛擬線程執(zhí)行器Bean
     * 后續(xù)可通過(guò)@Autowired注入,為指定任務(wù)分配虛擬線程
     */
    @Bean(name = "virtualThreadExecutor")
    public TaskExecutor virtualThreadExecutor() {
        // VirtualThreadTaskExecutor是Spring Boot 4.0新增的虛擬線程執(zhí)行器
        return new VirtualThreadTaskExecutor("custom-virtual-"); // 線程名前綴
    }
}

2.3.2 服務(wù)類(lèi):使用虛擬線程執(zhí)行器

package com.example.virtualthread.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
@Slf4j
public class VirtualThreadService {
    // 注入自定義的虛擬線程執(zhí)行器
    @Autowired
    @Qualifier("virtualThreadExecutor")
    private TaskExecutor virtualThreadExecutor;
    /**
     * 局部使用虛擬線程執(zhí)行任務(wù)
     */
    public CompletableFuture<String> doTaskWithVirtualThread() {
        // 使用虛擬線程執(zhí)行器提交異步任務(wù)
        return CompletableFuture.runAsync(() -> {
            Thread currentThread = Thread.currentThread();
            log.info("局部虛擬線程任務(wù)執(zhí)行:name={}, isVirtual={}, id={}",
                    currentThread.getName(),
                    currentThread.isVirtual(),
                    currentThread.getId());
            // 模擬IO阻塞(如數(shù)據(jù)庫(kù)查詢(xún)、網(wǎng)絡(luò)請(qǐng)求)
            try {
                Thread.sleep(1000); // 虛擬線程會(huì)在此處掛起,釋放載體線程
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.error("線程執(zhí)行異常", e);
            }
        }, virtualThreadExecutor).thenApply(v -> "局部虛擬線程任務(wù)執(zhí)行完成");
    }
    /**
     * 對(duì)比:使用默認(rèn)平臺(tái)線程執(zhí)行任務(wù)
     */
    public CompletableFuture<String> doTaskWithPlatformThread() {
        // 使用默認(rèn)的ForkJoinPool(平臺(tái)線程)執(zhí)行任務(wù)
        return CompletableFuture.runAsync(() -> {
            Thread currentThread = Thread.currentThread();
            log.info("平臺(tái)線程任務(wù)執(zhí)行:name={}, isVirtual={}, id={}",
                    currentThread.getName(),
                    currentThread.isVirtual(),
                    currentThread.getId());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.error("線程執(zhí)行異常", e);
            }
        }).thenApply(v -> "平臺(tái)線程任務(wù)執(zhí)行完成");
    }
}

2.3.3 控制器:暴露接口測(cè)試

@GetMapping("/local-virtual")
public CompletableFuture<String> testLocalVirtualThread() {
    return virtualThreadService.doTaskWithVirtualThread();
}
@GetMapping("/platform-thread")
public CompletableFuture<String> testPlatformThread() {
    return virtualThreadService.doTaskWithPlatformThread();
}

2.3.4 運(yùn)行驗(yàn)證

分別訪問(wèn):

  • http://localhost:8080/test/local-virtual:日志中線程名以custom-virtual-開(kāi)頭,isVirtual=true
  • http://localhost:8080/test/platform-thread:日志中線程名以ForkJoinPool.commonPool-開(kāi)頭,isVirtual=false

說(shuō)明局部虛擬線程配置成功,實(shí)現(xiàn)了“按需啟用”的效果。

2.4 方式3:異步任務(wù)啟用虛擬線程(@Async注解)

Spring的@Async注解用于實(shí)現(xiàn)異步任務(wù),Spring Boot 4.0可通過(guò)配置AsyncTaskExecutor為虛擬線程池,讓所有@Async標(biāo)注的方法都使用虛擬線程執(zhí)行。

2.4.1 配置類(lèi):?jiǎn)⒂聾Async并指定虛擬線程池

package com.example.virtualthread.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.VirtualThreadTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync // 啟用異步任務(wù)支持
public class AsyncVirtualThreadConfig {
    /**
     * 配置@Async默認(rèn)使用的虛擬線程池
     */
    @Bean
    public Executor asyncVirtualThreadExecutor() {
        // 若需指定線程名前綴,可傳入?yún)?shù):new VirtualThreadTaskExecutor("async-virtual-")
        return new VirtualThreadTaskExecutor();
    }
}

2.4.2 異步服務(wù)類(lèi)

package com.example.virtualthread.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class AsyncVirtualThreadService {
    /**
     * 異步任務(wù),使用虛擬線程執(zhí)行
     */
    @Async // 未指定executor時(shí),使用默認(rèn)的asyncVirtualThreadExecutor
    public void asyncTaskWithVirtualThread() {
        Thread currentThread = Thread.currentThread();
        log.info("異步任務(wù)-虛擬線程:name={}, isVirtual={}, id={}",
                currentThread.getName(),
                currentThread.isVirtual(),
                currentThread.getId());
        // 模擬IO阻塞
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            log.error("異步任務(wù)執(zhí)行異常", e);
        }
    }
}

2.4.3 控制器:測(cè)試異步任務(wù)

@GetMapping("/async-virtual")
public String testAsyncVirtualThread() {
    asyncVirtualThreadService.asyncTaskWithVirtualThread();
    return "異步虛擬線程任務(wù)已提交,查看日志驗(yàn)證";
}
    

2.4.4 運(yùn)行驗(yàn)證

訪問(wèn)http://localhost:8080/test/async-virtual,查看日志:

2025-12-10 10:30:00.000  INFO 12345 --- [  virtual-456] c.e.v.service.AsyncVirtualThreadService  : 異步任務(wù)-虛擬線程:name=virtual-456, isVirtual=true, id=456

說(shuō)明@Async注解已成功結(jié)合虛擬線程執(zhí)行異步任務(wù)。

三、性能測(cè)試:虛擬線程VS平臺(tái)線程

為了直觀感受虛擬線程的性能優(yōu)勢(shì),我們?cè)O(shè)計(jì)一個(gè)IO密集型場(chǎng)景的性能測(cè)試:模擬大量并發(fā)請(qǐng)求,每個(gè)請(qǐng)求執(zhí)行一段包含IO阻塞(模擬數(shù)據(jù)庫(kù)查詢(xún))的邏輯,對(duì)比虛擬線程和平臺(tái)線程的吞吐量、響應(yīng)時(shí)間、資源占用情況。

3.1 測(cè)試環(huán)境

  • JDK:21
  • Spring Boot:4.0.0
  • 測(cè)試工具:JMeter 5.6
  • 服務(wù)器配置:8核16G(本地開(kāi)發(fā)機(jī),關(guān)閉其他占用資源的程序)
  • 測(cè)試場(chǎng)景:IO密集型(每個(gè)請(qǐng)求模擬1秒IO阻塞)

3.2 測(cè)試接口準(zhǔn)備

創(chuàng)建兩個(gè)接口,分別使用虛擬線程和平臺(tái)線程處理請(qǐng)求:

/**
 * 虛擬線程性能測(cè)試接口(IO密集型)
 */
@GetMapping("/performance/virtual")
public String performanceTestVirtual() {
    // 模擬IO阻塞(如數(shù)據(jù)庫(kù)查詢(xún)、Redis操作)
    try {
        Thread.sleep(1000); // 關(guān)鍵:IO阻塞時(shí)虛擬線程會(huì)掛起
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        return "測(cè)試失敗";
    }
    return "虛擬線程測(cè)試成功";
}

/**
 * 平臺(tái)線程性能測(cè)試接口(IO密集型)
 */
@GetMapping("/performance/platform")
public String performanceTestPlatform() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        return "測(cè)試失敗";
    }
    return "平臺(tái)線程測(cè)試成功";
}
    

注意:平臺(tái)線程接口需關(guān)閉全局虛擬線程配置(將spring.threads.virtual.enabled設(shè)為false),并配置Tomcat平臺(tái)線程池大?。?/p>

# 平臺(tái)線程測(cè)試時(shí)的配置
spring:
  threads:
    virtual:
      enabled: false
server:
  tomcat:
    threads:
      min-spare: 50
      max: 200 # 平臺(tái)線程池最大線程數(shù)(傳統(tǒng)Web應(yīng)用常用配置)
    max-connections: 10000

3.3 JMeter測(cè)試計(jì)劃設(shè)計(jì)

分別對(duì)兩個(gè)接口進(jìn)行壓力測(cè)試,測(cè)試參數(shù)一致:

  • 線程組:并發(fā)用戶(hù)數(shù)1000, Ramp-Up時(shí)間10秒(每秒增加100個(gè)用戶(hù)),循環(huán)次數(shù)10次
  • 取樣器:HTTP請(qǐng)求,路徑分別為/performance/virtual和/performance/platform
  • 監(jiān)聽(tīng)器:聚合報(bào)告(查看吞吐量、響應(yīng)時(shí)間)、服務(wù)器性能監(jiān)控(查看CPU、內(nèi)存占用)

3.4 測(cè)試結(jié)果對(duì)比

測(cè)試指標(biāo)虛擬線程平臺(tái)線程(Tomcat最大200)性能提升幅度
吞吐量(Requests/sec)980195≈403%
平均響應(yīng)時(shí)間(ms)10205120≈79.9%
90%響應(yīng)時(shí)間(ms)11006200≈82.3%
CPU占用率(峰值)45%78%≈42.3%(資源占用降低)
內(nèi)存占用(峰值)1.2G2.5G≈52%(資源占用降低)
測(cè)試結(jié)論:在IO密集型場(chǎng)景下,虛擬線程的吞吐量是平臺(tái)線程的5倍左右,響應(yīng)時(shí)間降低80%以上,同時(shí)CPU和內(nèi)存占用大幅減少。這是因?yàn)樘摂M線程在IO阻塞時(shí)會(huì)釋放載體線程,避免了平臺(tái)線程因線程池滿(mǎn)而導(dǎo)致的請(qǐng)求排隊(duì)現(xiàn)象。

四、相關(guān)內(nèi)容拓展

4.1 虛擬線程的適用場(chǎng)景與不適用場(chǎng)景

4.1.1 適用場(chǎng)景

  • Web服務(wù):如Spring Boot REST接口、Spring MVC應(yīng)用(高并發(fā)IO場(chǎng)景)
  • 微服務(wù)調(diào)用:如Feign、Dubbo等遠(yuǎn)程接口調(diào)用(存在網(wǎng)絡(luò)IO阻塞)
  • 數(shù)據(jù)查詢(xún):如數(shù)據(jù)庫(kù)查詢(xún)、Redis緩存操作(存在IO阻塞)
  • 消息隊(duì)列消費(fèi):如RabbitMQ、Kafka消費(fèi)者(存在等待消息的IO阻塞)

4.1.2 不適用場(chǎng)景

  • CPU密集型任務(wù):如大規(guī)模數(shù)學(xué)計(jì)算、循環(huán)處理(虛擬線程掛起機(jī)會(huì)少,無(wú)法發(fā)揮優(yōu)勢(shì))
  • 依賴(lài)線程局部變量(ThreadLocal)的場(chǎng)景:虛擬線程數(shù)量極大,若每個(gè)線程都占用ThreadLocal資源,可能導(dǎo)致內(nèi)存泄漏(需謹(jǐn)慎使用,或改用其他共享方式)
  • 依賴(lài)線程ID(Thread.getId())的場(chǎng)景:虛擬線程的ID是JVM分配的,可能重復(fù)(不建議用線程ID作為唯一標(biāo)識(shí))

4.2 Spring Boot 4.0 對(duì)虛擬線程的其他支持

  • Spring Scheduler集成:可通過(guò)配置@Scheduled的線程池為虛擬線程池,實(shí)現(xiàn)定時(shí)任務(wù)的高并發(fā)執(zhí)行
  • WebFlux支持:Spring Boot 4.0的WebFlux(響應(yīng)式編程)也支持虛擬線程,可通過(guò)配置Reactor的線程池為虛擬線程
  • 測(cè)試支持:Spring Boot Test提供了@VirtualThreadTest注解,可在測(cè)試用例中啟用虛擬線程
// 示例:Spring Scheduler使用虛擬線程
@Configuration
@EnableScheduling
public class SchedulerVirtualThreadConfig {
    @Bean
    public ScheduledExecutorService scheduledExecutorService() {
        return Executors.newVirtualThreadPerTaskExecutor();
    }
    @Scheduled(fixedRate = 1000)
    public void scheduledTask() {
        log.info("定時(shí)任務(wù)-虛擬線程:name={}, isVirtual={}",
                Thread.currentThread().getName(),
                Thread.currentThread().isVirtual());
    }
}

4.3 虛擬線程的常見(jiàn)問(wèn)題與解決方案

4.3.1 問(wèn)題1:虛擬線程數(shù)量過(guò)多,導(dǎo)致日志混亂

解決方案:通過(guò)VirtualThreadTaskExecutor指定線程名前綴,便于日志篩選和問(wèn)題定位,如new VirtualThreadTaskExecutor(“order-service-virtual-”)。

4.3.2 問(wèn)題2:使用ThreadLocal導(dǎo)致內(nèi)存泄漏

解決方案:

  • 盡量避免在虛擬線程中使用ThreadLocal,改用上下文傳遞(如方法參數(shù)、RequestContextHolder)
  • 若必須使用,可在任務(wù)執(zhí)行完成后手動(dòng)清理ThreadLocal:threadLocal.remove()

4.3.3 問(wèn)題3:第三方庫(kù)不支持虛擬線程

解決方案:部分老的第三方庫(kù)可能依賴(lài)平臺(tái)線程的特性(如線程優(yōu)先級(jí)、線程組),此時(shí)可將該庫(kù)的調(diào)用封裝在平臺(tái)線程中執(zhí)行,其他部分使用虛擬線程,實(shí)現(xiàn)混合線程模型。

五、總結(jié)

Spring Boot 4.0對(duì)虛擬線程的集成極為友好,通過(guò)簡(jiǎn)單的配置即可啟用,無(wú)需修改大量業(yè)務(wù)代碼。在IO密集型場(chǎng)景下,虛擬線程能大幅提升系統(tǒng)吞吐量、降低響應(yīng)時(shí)間和資源占用,是Java并發(fā)編程的重大突破。

本文講解了3種核心配置方式(全局啟用、局部Bean啟用、異步任務(wù)啟用),提供了完整的示例代碼和性能測(cè)試流程,并拓展了虛擬線程的適用場(chǎng)景、Spring Boot的額外支持及常見(jiàn)問(wèn)題解決方案。希望能幫助大家快速掌握Spring Boot 4.0虛擬線程的使用,并在實(shí)際項(xiàng)目中合理運(yùn)用這一技術(shù)提升系統(tǒng)性能。

后續(xù)可進(jìn)一步深入研究虛擬線程的底層實(shí)現(xiàn)原理(如載體線程調(diào)度、Fork/Join框架集成),以及在微服務(wù)架構(gòu)中的大規(guī)模應(yīng)用實(shí)踐。

到此這篇關(guān)于Spring Boot 4.0 虛擬線程啟用配置與性能測(cè)試全解析的文章就介紹到這了,更多相關(guān)Spring Boot 虛擬線程配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java后臺(tái)如何接收get請(qǐng)求傳過(guò)來(lái)的數(shù)組

    java后臺(tái)如何接收get請(qǐng)求傳過(guò)來(lái)的數(shù)組

    這篇文章主要介紹了java后臺(tái)如何接收get請(qǐng)求傳過(guò)來(lái)的數(shù)組問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot項(xiàng)目配置文件注釋亂碼的問(wèn)題解決方案

    SpringBoot項(xiàng)目配置文件注釋亂碼的問(wèn)題解決方案

    這篇文章主要介紹了SpringBoot 項(xiàng)目配置文件注釋亂碼的問(wèn)題解決方案,文中通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • java高并發(fā)的并發(fā)級(jí)別詳解

    java高并發(fā)的并發(fā)級(jí)別詳解

    這篇文章主要介紹了java高并發(fā)的并發(fā)級(jí)別,內(nèi)容十分豐富,在這里分享給大家,需要的朋友可以參考,希望能夠給你帶來(lái)幫助
    2021-10-10
  • 深入理解java中的null“類(lèi)型”

    深入理解java中的null“類(lèi)型”

    這篇文章主要介紹了深入理解java中的null“類(lèi)型”,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例

    springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例

    這篇文章主要介紹了springboot集成mybatisPlus+多數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能

    Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能

    這篇文章主要介紹了Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能,在實(shí)際的業(yè)務(wù)中,可以根據(jù)客戶(hù)的需求設(shè)置不同的文件上傳需求,支持普通服務(wù)器上傳+分布式上傳(Fast DFS)+云服務(wù)上傳OSS(OSS),需要的朋友可以參考下
    2024-04-04
  • java 實(shí)現(xiàn)鏈棧存儲(chǔ)的方法

    java 實(shí)現(xiàn)鏈棧存儲(chǔ)的方法

    下面小編就為大家?guī)?lái)一篇java 實(shí)現(xiàn)鏈棧存儲(chǔ)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 詳解Spring+Hiernate整合

    詳解Spring+Hiernate整合

    這篇文章主要介紹了詳解Spring+Hiernate整合,spring整合hibernate主要介紹以xml方式實(shí)現(xiàn),有興趣的可以了解一下。
    2017-04-04
  • Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    這篇文章主要為大家詳細(xì)介紹了Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解Java I/O流中的字符流有哪些

    詳解Java I/O流中的字符流有哪些

    字節(jié)流的功能已經(jīng)十分強(qiáng)大,幾乎可以直接或間接地處理任何類(lèi)型的輸入/輸出操作,但它卻不能直接操作16位的Unicode字符,這就需要使用字符流,所以在今天的內(nèi)容中,小編會(huì)給大家講解IO流中的字符流,希望各位能夠繼續(xù)耐心學(xué)習(xí)
    2023-10-10

最新評(píng)論

分宜县| 盈江县| 汤阴县| 余姚市| 浦北县| 德阳市| 白朗县| 翁牛特旗| 丰宁| 新乡市| 霍城县| 色达县| 信丰县| 铜梁县| 禄劝| 建德市| 翁源县| 博野县| 将乐县| 宜良县| 玛曲县| 塘沽区| 依安县| 常山县| 宜黄县| 兴业县| 资源县| 锡林郭勒盟| 新乡县| 广东省| 姚安县| 大足县| 竹山县| 商城县| 康乐县| 宜川县| 墨竹工卡县| 新郑市| 太湖县| 慈溪市| 江城|